Jedis怎么模糊查询map

Jedis怎么模糊查询map,第1张

以Staff对象为例,在关系型数据库或类似GridGain的内存网格产品中(底层使用H2数据库的内存模式存储),我们以表形式保存对象的数据。因为内存网格是基于对象做缓存的,所以还要额外多出一列(Staff列)保存整个对象的编码,例如序列化后的二进制或者JSON格式等,便于直接返回给应用后进行反序列化。而在Redis中,我们可以用id作为唯一标识,使用key-value、hash、zSet三种数据结构进行保存。Key-value是为了保存id和整个对象,确定id范围后可根据它将对象返回给客户端,而选择其他两种数据结构的具体原因后面再说。

看过许多redis优化的案例,通过引入hashmap的方式将key散列到多个hashmap,

具体可以见:

Redis 利用Hash存储节约内存 - 刘本龙的专栏 - CSDN博客

我们得到如下公式:

原来是:

key1,key2,key3,key4,key5

变成

hash1:

key1:value1

key2:value2

key3:value2

hash2:

key4:value4

key5:value5

虽然名义上5个key变成了2个hashmap,但是每个filed还是会保存原始的key,所以从key减少的层面是行不通的,这个时候就要从底层储存结构去看。

redis对hashmap有一个优化,当filed数量比较少的时候(因为ziplist是用顺序遍历的方式查找元素,所以数量多了复杂度是o(N)肯定不合适。

),会用一个叫ziplist的结构保存,而不是传统的hash结构,ziplist有几个特点:

ziplist介绍

>

本篇文章是对在JS中Map和List的简单实现代码进行了详细的分析介绍 需要的朋友参考下   复制代码 代码如下: /   MAP对象 实现MAP功能     接口   size()     获取MAP元素个数   isEmpty()    判断MAP是否为空   clear()     删除MAP所有元素   put(key value)   向MAP中增加元素(key value)   remove(key)    删除指定KEY的元素 成功返回True 失败返回False   get(key)    获取指定KEY的元素值VALUE 失败返回NULL   element(index)   获取指定索引的元素(使用element key element value获取KEY和VALUE) 失败返回NULL   containsKey(key)  判断MAP中是否含有指定KEY的元素   containsValue(value) 判断MAP中是否含有指定VALUE的元素   values()    获取MAP中所有VALUE的数组(ARRAY)   keys()     获取MAP中所有KEY的数组(ARRAY)     例子   var map = new Map();     map put("key" "value");   var val = map get("key")   ……    / function Map() {     this elements = new Array();     //获取MAP元素个数     this size = function() {         return this elements length;     };     //判断MAP是否为空     this isEmpty = function() {         return (this elements length < );     };     //删除MAP所有元素     this clear = function() {         this elements = new Array();     };     //向MAP中增加元素(key value)     this put = function(_key _value) {         this elements push( {             key : _key             value : _value         });     };     //删除指定KEY的元素 成功返回True 失败返回False     this remove = function(_key) {         var bln = false;         try {             for (i = ; i < this elements length; i++) {                 if (this elements[i] key == _key) {                     this elements splice(i );                     return true;                 }             }         } catch (e) {             bln = false;         }         return bln;     };     //获取指定KEY的元素值VALUE 失败返回NULL     this get = function(_key) {         try {             for (i = ; i < this elements length; i++) {                 if (this elements[i] key == _key) {                     return this elements[i] value;                 }             }         } catch (e) {             return null;         }     };     //获取指定索引的元素(使用element key element value获取KEY和VALUE) 失败返回NULL     this element = function(_index) {         if (_index < || _index >= this elements length) {             return null;         }         return this elements[_index];     };     //判断MAP中是否含有指定KEY的元素     this containsKey = function(_key) {         var bln = false;         try {             for (i = ; i < this elements length; i++) {                 if (this elements[i] key == _key) {                     bln = true;                 }             }         } catch (e) {             bln = false;         }         return bln;     };     //判断MAP中是否含有指定VALUE的元素     this containsValue = function(_value) {         var bln = false;         try {             for (i = ; i < this elements length; i++) {                 if (this elements[i] value == _value) {                     bln = true;                 }             }         } catch (e) {             bln = false;         }         return bln;     };     //获取MAP中所有VALUE的数组(ARRAY)     this values = function() {         var arr = new Array();         for (i = ; i < this elements length; i++) {             arr push(this elements[i] value);         }         return arr;     };     //获取MAP中所有KEY的数组(ARRAY)     this keys = function() {         var arr = new Array();         for (i = ; i < this elements length; i++) {             arr push(this elements[i] key);         }         return arr;     }; } 复制代码 代码如下: /   js实现list    / function List() {     this value = [];     / 添加 /     this add = function(obj) {         return this value push(obj);     };     / 大小 /     this size = function() {         return this value length;     };     / 返回指定索引的值 /     this get = function(index) {         return this value[index];     };     / 删除指定索引的值 /     this remove = function(index) {         this value splice(index );         return this value;     };     / 删除全部值 /     this removeAll = function() {         return this value = [];     };     / 是否包含某个对象 /     this constains = function(obj) {         for ( var i in this value) {             if (obj == this value[i]) {                 return true;             } else {                 continue;             }         }         return false;     };     / 是否包含某个对象 /     this getAll = function() {         var allInfos = ;         for ( var i in this value) {             if(i != (value length )){                 allInfos += this value[i]+" ";             }else{                 allInfos += this value[i];             }         }         alert(allInfos);         return allInfos += this value[i]+" ";;     }; } lishixinzhi/Article/program/Java/JSP/201311/20400

思路:利用反射获取hashmap里的threshold(扩容上限)除以 负载因子 就得到容器大小了。

打印结果如下:

160

320

640

1280

2560

5120

10240

20480

这是hashmap添加1000个元素时容器容量大小的变化情况

Bitmap实际上并不是一种数据类型,而是定义在 String 类型上的面向位的 *** 作。因为String是二进制安全的并且最大长度为512MB,所以String可以建立2^32个不同的位。位 *** 作被分为两种:

Bitmap最大的一个优点是当存储信息时可以节省极大的空间。例如一个系统中的用户ID由递增的ID表示,只需使用512MB的内存,就可以记住40亿用户的单比特信息(例如,知道用户是否想收到通讯)。

Bitmap使用 SETBIT 和 GETBIT 命令设置和获取位的值:

SETBIT 命令第一个参数表示需要被设置的位,第二个参数表示需要设置的值(1或者0)。需要注意的是,当被设置的位超过字符串当前的长度时, SETBIT 命令将会自动增加字符串的长度。 GETBIT 返回指定位上的值,对于超过字符串当前长度范围的位,总是被视为0。

Bitmap有三个命令是基于对一组位进行 *** 作的命令:

BITPOS 和 BITCOUNT 都可以对字符串的字节范围进行 *** 作,Bitmap的常见使用场景有:

比如想统计网站最长的用户连续访问天数,可以使用Bitmap,每个位的值作为该天是否访问网站的标志(第一位表示第一天,第二位表示第二天,以此类推),每当用户访问网站时可以使用 SETBIT 设置该天对应的位为1,最后统计连续设置为1的位的数量即可。使用 BITCOUNT 可以统计出用户访问网站的天数,使用 BITPOS 即可统计出最长的连续访问天数。为了分片数据集,最好避免使用大键,可以让每个键存储M个位,将(位数/M)的值与键名关联,将(位数%M)可以获取位数处于键内的位置。

下面是Bitmap相关命令。

Redis Bitmap

原文连接

    JedisCluster是针对RedisCluster的java客户端,它封装了java访问redis集群的各种 *** 作,包括初始化连接、请求重定向等。我们先来看下JedisCluster的类结构:

    JedisCluster初始化时,所有的集群连接信息都是封装在JedisClusterInfoCache里,由于jedis本身不是线程安全的,所以使用对象池JedisPool来保证线程安全,在JedisClusterInfoCache中,除了要保存节点和槽的一一对应关系,还要为每个节点建立一个对象池JedisPool,并保存在map。这个类主要用于保存集群的配置信息,并且是JedisCluster初始化部分的核心所在。JedisClusterConnectionHandler是cache类的一个窗口,cache类似数据管理层,而Handler就类似于 *** 控数据提供服务的Service层。

    从上图可以看出,Jedis建立集群的过程很清晰,传入节点信息,通过其中一个节点从redis服务器拿到整个集群的信息,包括槽位对应关系,主从节点的信息,将这些信息保存在JedisClusterInfoCache中。

    在发送请求时,JedisCluster对象先从初始化得到的集群map中获取key对应的节点连接,即一个可用的Jedis对象。然后通过这个对象发送get key 命令。

    通常,根据key计算槽位得到的节点不会报错。所以如果发生connectionException,或者MovedDataException,说明初始化得到的槽位与节点的对应关系有问题,即与实际的对应关系不符,应当重置map。 如果出现ASK异常,说明数据正在迁移,需要临时使用返回消息指定的地址,重新发送命令。在这里,Jedis通过异常反馈,智能地同步了客户端与服务端的集群信息。

java编程一直以来都是互联网上使用比较广泛的一种编程语言,所以我们今天就一起来了解一下java编程中的抽象类是如何来实现的,希望通过对本文的阅读,大家能够对java编程技术有更深刻的认识,下面昌平电脑培训就开始今天的主要内容吧。

AbstractMap抽象类实现了一些简单且通用的方法,本身并不难。但在这个抽象类中有两个方法非常值得关注,keySet和values方法源码的实现可以说是教科书式的典范。

抽象类通常作为一种骨架实现,为各自子类实现公共的方法。上一篇我们讲解了Map接口,此篇对AbstractMap抽象类进行剖析研究。

Java中Map类型的数据结构有相当多,AbstractMap作为它们的骨架实现实现了Map接口部分方法,也就是说为它的子类各种Map提供了公共的方法,没有实现的方法各种Map可能有所不同。

抽象类不能通过new关键字直接创建抽象类的实例,但它可以有构造方法。AbstractMap提供了一个protected修饰的无参构造方法,意味着只有它的子类才能访问(当然它本身就是一个抽象类,其他类也不能直接对其实例化),也就是说只有它的子类才能调用这个无参的构造方法。

在Map接口中其内部定义了一个Entry接口,这个接口是Map映射的内部实现用于维护一个key-value键值对,key-value存储在这个MapEntry中。AbstractMap对这个内部接口进行了实现,一共有两个:一个是可变的SimpleEntry和一个是不可变的SimpleImmutableEntry。

publicstaticclassSimpleEntryimplementsEntry,javaioSerializable

实现了MapEntry接口,并且实现了Serializable(可被序列化)。

它的方法比较简单都是取值存值的 *** 作,对于key值的定义是一个final修饰意味着是一个不可变的引用。另外其setValue方法稍微特殊,存入value值返回的并不是存入的值,而是返回的以前的旧值。需要重点学习的是它重写的equals和hashCode方法。

publicstaticclassSimpleImmutableEntryimplementsEntry,javaioSerializableSimpleImmutableEntry

定义为不可变的Entry,其实是事实不可变,因为它不提供setValue方法,在多个线程同时访问时自然不能通过setValue方法进行修改。它相比于SimpleEntry其key和value成员变量都被定义为了final类型。调用setValue方法将会抛出UnsupportedOperationException异常。

它的equals和hashCode方法和SimpleEntry一致。

接下来查看AbstractMap抽象类实现了哪些Map接口中的方法。

publicintsize()

Map中定义了一个entrySet方法,返回的是MapEntry的Set集合,直接调用Set集合的size方法即是Map的大小。

publicbooleanisEmpty()

调用上面的size方法,等于0即为空。

publicbooleancontainsKey(Objectkey)

这个方法的实现较为简单,通过调用entrySet方法获取Set集合的迭代器遍历MapEntry,与参数key比较。Map可以存储为null的key值,由于key=null在Map中存储比较特殊(不能计算hashCode值),所以在这里也做了判断参数key是否为空。

以上就是关于Jedis怎么模糊查询map全部的内容,包括:Jedis怎么模糊查询map、redis 用hashmap省内存的误解、JS Map 和 List 的简单实现代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9462567.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存