1、打开reidis,选择第三个数据库。
2、rpush listInfo aa,向listInfo添加数据,向后加,r代表右。
3、push listInfo bb,向listInfo添加数据,向前加。
4、lrange listInfo 0-1,代表查询所有添加的数据。
5、rpop listInfo,取出并移除keyList最后一个元素,右边的元素。
6、ltrim listInfo 1 2 ,删除底标为1, 2的数据。
相信各位在使用redis集群的时候,对于redis集群中的批量 *** 作都会有一个现象:使用redis集群进行批量获取数据的时候,效率总是不高,取一次数据要达到几百毫秒,当你 *** 作的数据是百万级别的时候,你就会发现redis的读取效率压根就不能接受。接下来告诉大家如何进行了解
### redis集群的哈希槽
redis集群中内置了16384个哈希槽,当一个key值准备存储的时候,是先通过将key进行 crc16 校验,校验后的值对16384取值,得到的值就是该key所在的槽(slot);redis集群中,节点上的槽是连续的一段,因此通过我们计算key得到的slot,就能判断该key是在存储在哪个节点上的。
#### 如何判断redis集群中各个节点上的slot分布?
使用命令 : cluster nodes 或者 cluster slots
#### 如何知道一个key值对应的槽
使用命令: cluster keyslots {key}
#### 提高效率的解决方案
因此,通过上面我们就可以知道key值存储对应的reids集群的节点,因此我们可以做以下处理:将你所需要的key按照槽的值进行分批,用单点连接的形式连接到某个redis节点上,批量取处于同一个节点上的key。
注意:
- 一定要用单点的形式进行连接,还是使用集群方式连接的话,就算是处于一个节点,效率也是没有提高的;
- redis集群单点连接的话,不能使用mget,因此mget只能取位于同一个 slot 上的,你可以使用pipeline进行事务处理;
### 一次具体的实现
目前我使用的语言的php,借鉴了
[crc16算法计算](>
Redis的服务器进程就是一个事件循环(loop),这个循环中的文件事件负责接收客户端的命令请求,以及向客户端发送命令回复,而时间事件则负责执行像serverCron函数这样需要定时运行的函数。服务器每次结束一个事件循环的之前,会调用flushAppendOnlyFile函数,考虑是否需要将aof_buf缓冲区中的内容写入和保存到AOF文件里面。
命令格式
中文
查看Redis里面有多少Key
命令格式
获取不存在的Key返回 nil
命令格式
创建redis客户连接
创建字符串
获得字符串的值
更新字符串的值,key存在则不覆盖
对字符串进行增加和减小
向列表中插入数据的命令为:
从列表左侧插入数据
“lpush”和“rpush”语法相同
命令格式
查看索引为6的数据
查看索引从2到5的数据,包含两端
命令格式
在数据d出的同时,被d的数据也会从列表中删除
修改命令
批量添加
Python中使用列表向Redis列表中批量添加数据
在Python中获取Redis列表的多个数据
使用for循环把数据展开
从左右侧d出数据
命令格式
命令格式
命令格式
smembers命令不会删除数据。如果集合里的数据量极大,谨慎使用,消耗系统I/O资源
如果数据存在,则返回“1”;如果数据不存在,则返回“0”
删除特定的数据
命令格式
命令格式
命令格式
求key1中有,在key2 key3没有的数据
“scard”查看集合中数据条数,“spop”从集合中获取一条数据,Python中无“count”参数
“smembers”读取集合全部数据
“srem”删除特定数据
String、Hash、List、Set和Zset。
等同于java中的, Map<String,String> string 是redis里面的最基本的数据类型,一个key对应一个value。
应用场景 :String是最常用的一种数据类型,普通的key/value存储都可以归为此类,如用户信息,登录信息和配置信息等;
实现方式 :String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr、decr等 *** 作(自增自减等原子 *** 作)时会转成数值型进行计算,此时redisObject的encoding字段为int。
Redis虽然是用C语言写的,但却没有直接用C语言的字符串,而是自己实现了一套字符串。目的就是为了提升速度,提升性能。 Redis构建了一个叫做简单动态字符串(Simple Dynamic String),简称SDS。
Redis的字符串也会遵守C语言的字符串的实现规则,即 最后一个字符为空字符。然而这个空字符不会被计算在len里头。
Redis动态扩展步骤:
Redis字符串的性能优势
常用命令 :set/get/decr/incr/mget等,具体如下;
ps:计数器(字符串的内容为整数的时候可以使用),如 set number 1。
补充:
等同于java中的: Map<String,Map<String,String>> ,redis的hash是一个string类型的field和value的映射表, 特别适合存储对象。 在redis中,hash因为是一个集合,所以有两层。第一层是key:hash集合value,第二层是hashkey:string value。所以判断是否采用hash的时候可以参照有两层key的设计来做参考。并且注意的是, 设置过期时间只能在第一层的key上面设置。
应用场景 :我们要存储一个用户信息对象数据,其中包括用户ID、用户姓名、年龄和生日,通过用户ID我们希望获取该用户的姓名或者年龄或者生日;
实现方式 :Redis的Hash实际是内部存储的Value为一个HashMap,并提供了直接存取这个Map成员的接口。如,Key是用户ID, value是一个Map。 这个Map的key是成员的属性名,value是属性值 。这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 也就是通过 key(用户ID) + field(属性标签) 就可以 *** 作对应属性数据。 当前HashMap的实现有两种方式 :当HashMap的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,这时对应的value的redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时redisObject的encoding字段为int。
常用命令 :hget/hset/hgetall等,具体如下:
等同于java中的 Map<String,List<String>> ,list 底层是一个链表,在redis中,插入list中的值,只需要找到list的key即可,而不需要像hash一样插入两层的key。 list是一种有序的、可重复的集合。
应用场景 :Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现;
实现方式 :Redis list的实现为一个 双向链表 ,即可以支持反向查找和遍历,更方便 *** 作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括 发送缓冲队列 等也都是用的这个数据结构。
常用命令 :lpush/rpush/lpop/rpop/lrange等,具体如下:
性能总结 :
它是一个字符串链表,left、right都可以插入添加。
等同于java中的 Map<String,Set<String>> ,Set 是一种无序的,不能重复的集合。并且在redis中,只有一个key它的底层由hashTable实现的,天生去重。
应用场景 :Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动去重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且 set提供了判断某个成员是否在一个set集合内的重要接口 ,这个也是list所不能提供的;如保存一些标签的名字。标签的名字不可以重复,顺序是可以无序的。
实现方式 :set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。
常用命令 :sadd/spop/smembers/sunion等,具体如下:
ZSet(Sorted Set:有序集合) 每个元素都会关联一个double类型的分数score,分数允许重复,集合元素按照score排序( 当score相同的时候,会按照被插入的键的字典顺序进行排序 ),还可以通过 score 的范围来获取元素的列表。
应用场景 :Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以 通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。 当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
底层实现 : zset 是 Redis 提供的一个非常特别的数据结构,常用作排行榜等功能,以用户 id 为 value ,关注时间或者分数作为 score 进行排序。实现机制分别是 zipList 和 skipList 。规则如下:
zipList:满足以下两个条件
skipList:不满足以上两个条件时使用跳表、组合了hash和skipList
为什么用skiplist不用平衡树?
主要从内存占用、对范围查找的支持和实现难易程度这三方面总结的原因。
拓展:mysql为什么不用跳表?
常用命令 :zadd/zrange/zrem/zcard等;
官网地址: >
以上就是关于如何查询redis存储的所有数据全部的内容,包括:如何查询redis存储的所有数据、我是如何解决redis集群批量获取的效率问题的、redis一直循环获取有值就处理java等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)