文章目录
-
- 1 基本知识
-
- 1.1 select 切换数据库
- 1.2 dbsize 查看当前数据库key的数量
- 1.3 flushdb 清空当前库
- 1.4 flushall 清空所有库(16个库)
- 1.5 端口6379由来
- 1.6 统一密码管理
- 1.7 单线程 多路IO复用
- 2 redis键(key)
-
- 2.1 keys * 查看当前库的所有权key(匹配:keys *1 )
- 2.2 exists key 检查库中是否存在key
- 2.3 type key 查看制定key的类型
- 2.4 del 删除key数据
- 2.5 unlink key 根据value选择非阻塞删除
- 2.6 expire key 10 为指定的key设置过期时间
- 2.7 ttl key 检查还有多少秒过期
- 3 Redis字符串
-
- 3.1 set 添加值
- 3.2 get 添加值
- 3.3 append 追加值
- 3.4 strlen 获取值得长度
- 3.5 setnx 互斥设置值
- 3.6 incr 将key存储值增加1
- 3.7 decr 将key存储值减1
- 3.8 incrby 将key增加指定值的值
- 3.9 decrby 将key中的值步长减少指定的值
- 3.10 mset 同时设置多个键值对
- 3.11 mget 同时获得多个键值对
- 3.12 msetnx 同时,多置多个键对同时相互排斥
- 3.13 getrange 获取值得范围
- 3.14 setrange 存储在设置值中的字符串
- 3.15 setex 设置键值时,设置过期时间秒
- 3.16 getset 用新值代替旧值
- 3.17 String总结数据结构
- 4 Redis 列表List
-
- 4.1 lpush 从左边插入一个或多个值
- 4.2 lrange 从左边取出一个或多个值
- 4.3 rpush 从右侧插入一个或多个值
- 4.4 lpop 从左边吐出一个值
- 4.5 rpop 从右边吐出一个值
- 4.6 rpoplpush 从k1列表右边吐出一个值插入到k2列表左边
- 4.7 lindex 根据索引(从左到右)下标获得元素
- 4.8 llen 列表的长度
- 4.9 linsert 值得后面插入值
- 4.10 lrem 删除list指定元素
- 4.11 lset 将列表下标index的值替换成value
- 4.12 List总结数据结构
- 5 Redis 集合Set
-
- 5.1 sadd 添加元素
- 5.2 smembers 取出集合中的元素
- 5.3 sismenber 判断是否存在元素集中
- 5.4 scard 回到集合中的元素数
- 5.5 srem 删除集合中的指定元素
- 5.6 spop 从集合中随机取出一个值
- 5.7 srandmember n个值不会随机从集合中删除
- 5.8 smove 将集合元素移动到另一个集合元素
- 5.9 sinter 取出集中交集
- 5.10 sunion 取出集合并集
- 5.11 sdiff 取出集合差集
- 5.12 Set总结数据结构
- 6 Redis哈希(Hash)
-
- 6.1 hset 向hash中添加值
- 6.2 hget 从hash中取出值
- 6.3 hmset 批量设置hash值
- 6.4 hexists 查看哈希表key中,给定域field是否存在
- 6.5 hkeys 列出该hash集合的所有filed
- 6.6 hvals 列出该hash集合的所有value
- 6.7 hincrby 为哈希表key中的域field 加上增量1
- 6.8 hsetnx 将哈希表中key中的域field的值设置为value,当且仅当域field不存在
- 6.9 Hash总结数据结构
- 7 Redis有序集合Zset(sorted set)
-
- 7.1 zadd 添加元素
- 7.2 zrange 取出元素
- 7.3 zrangebyscore 取出范围内的值
- 7.4 zrevrangebyscore 倒序取出范围元素
- 7.5 zincrby 为元素的score加上增量
- 7.6 zrem 删除元素
- 7.7 zconut 集合分数范围下的元素个数统计
- 7.8 zrank 回到集合排名
- 7.9 Zset 总结数据结构
1 基本知识
1.1 select 切换数据库
默认情况下,从0开始使用16个数据库select 15 切换到15号数据库
[chengwen@localhost redis]$ redis-server /etc/redis.conf [chengwen@localhost redis]$ redis-cli 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> select 15 OK 127.0.0.1:6379[15]> select 0 OK 127.0.0.1:6379>
1.2 dbsize 查看当前数据库key的数量
查看当前数据库key的数量
127.0.0.1:6379> dbsize (integer) 0 127.0.0.1:6379>
1.3 flushdb 清空当前库
清空当前库
127.0.0.1:6379> flushdb OK 127.0.0.1:6379>
1.4 flushall 清空全部库(16个库)
清空所有库(16个库)
127.0.0.1:6379> flushall OK 127.0.0.1:6379>
1.5 端口6379由来
Alessia Merz 女明星的名字Merz 手机键盘上的数字对应四个字母。
1.6 统一密码管理
所有库都有相同的密码
1.7 单线程 多路IO复用
多路复用是指使用一个线程检查多个文件描述符(Socket)就绪状态,如调用select和poll函数,输入多个文件描述符,如果有文件描述符就绪,回。否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如使用线程池)
串行 vs 多线程+锁(memcache) vs 单线程+多路IO复用(redis)
与Memcache三点不同:支持多数据类型,支持持久化,单线程+多路IO复用
2 redis键(key)
redis键(key)
2.1 keys * 查看当前库所有key(匹配:keys *1 )
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 lucy
OK
127.0.0.1:6379> set k2 mary
OK
127.0.0.1:6379> set k3 jack
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
3) "k1"
127.0.0.1:6379>
2.2 exists key 查看库中是否存在key
存在返回值1 ,不存在返回值0
127.0.0.1:6379> exists k1
(integer) 1
127.0.0.1:6379> exists k4
(integer) 0
127.0.0.1:6379>
2.3 type key 查看制定key的类型
127.0.0.1:6379> type k2
string
127.0.0.1:6379>
2.4 del 删除key数据
127.0.0.1:6379> del k3
(integer) 1
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379>
2.5 unlink key 根据value选择非阻塞删除
仅将keys 从keyspace 元数据中删除,真正的删除会再后续异步操作。
127.0.0.1:6379> set k3 zhoumin
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
3) "k1"
127.0.0.1:6379> get k3
"zhoumin"
127.0.0.1:6379> unlink key k3
(integer) 1
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379>
2.6 expire key 10 为指定的key设置过期时间
127.0.0.1:6379> expire k1 10
(integer) 1
127.0.0.1:6379> ttl k1
(integer) -2
127.0.0.1:6379> ttl k2
(integer) -1
127.0.0.1:6379>
2.7 ttl key 查看还有多少秒过期
-1 表示永不过期 -2 表示已过期 1 表示未过期
127.0.0.1:6379> ttl k1
(integer) -2
127.0.0.1:6379> ttl k2
(integer) -1
127.0.0.1:6379>
3 Redis字符串
String 是redis 最基本的数据类型,可以理解为与memcache 一模一样的类型,一个key对应一个value
String类型是二进制安全的。意味着redis 的string可以包含任何数据。比如jpg图片或者序列化的对象。
String类型是redis 最基本的数据类型,一个redis 中字符串value最多可以是512M
3.1 set 添加值
[chengwen@localhost redis]$ redis-server /etc/redis.conf
[chengwen@localhost redis]$ redis-cli
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v100
OK
127.0.0.1:6379> set k2 v200
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379> get k1
"v100"
127.0.0.1:6379> set k1 v1100
OK
127.0.0.1:6379> get k1
"v1100"
127.0.0.1:6379>
3.2 get 添加值
127.0.0.1:6379> set k1 v1100
OK
127.0.0.1:6379> get k1
"v1100"
127.0.0.1:6379>
3.3 append 追加值
127.0.0.1:6379> set k1 v1100
OK
127.0.0.1:6379> get k1
"v1100"
127.0.0.1:6379> append k1 zhoumin
(integer) 12
127.0.0.1:6379> get k1
"v1100zhoumin"
127.0.0.1:6379>
3.4 strlen 获取值得长度
127.0.0.1:6379> strlen k1
(integer) 12
127.0.0.1:6379>
3.5 setnx 互斥设置值
如果已经存在key则不设置,返回0表示未设置成功。
127.0.0.1:6379> setnx k1 zhoumin
(integer) 0
127.0.0.1:6379> get k1
"v1100zhoumin"
127.0.0.1:6379>
如果不存在才能设置成功,返回1
127.0.0.1:6379> setnx k3 v300
(integer) 1
127.0.0.1:6379> get k3
"v300"
127.0.0.1:6379>
3.6 incr 将key中存储的值增加1
只能对数字值操作,如果为空,新增值为1
127.0.0.1:6379> set k4 400
OK
127.0.0.1:6379> incr k4
(integer) 401
127.0.0.1:6379> get k4
"401"
127.0.0.1:6379>
3.7 decr 将key中存储的值减1
只能对数字值操作,如果为空,新增值为-1
127.0.0.1:6379> set k4 400
OK
127.0.0.1:6379> incr k4
(integer) 401
127.0.0.1:6379> get k4
"401"
127.0.0.1:6379> decr k4
(integer) 400
127.0.0.1:6379>
3.8 incrby 将key中的值步长增加指定的值
127.0.0.1:6379> incrby k4 10
(integer) 410
127.0.0.1:6379> get k4
"410"
3.9 decrby 将key中的值步长减少指定的值
127.0.0.1:6379> decrby k4 20
(integer) 390
127.0.0.1:6379> get k4
"390"
127.0.0.1:6379>
3.10 mset 同时设置多个键值对
[chengwen@localhost redis]$ redis-server /etc/redis.conf
[chengwen@localhost redis]$ redis-cli
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379>
3.11 mget 同时获取多个键值对
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379>
3.12 msetnx 同时互斥设置多个键值对
同时设置多个值,如果其中一个已经存在都不能设置成功,返回值 0
127.0.0.1:6379> msetnx k11 v11 k12 v12 k1 v11
(integer) 0
127.0.0.1:6379>
如果同时设置的key值在库中都不存在则设置成功,返回值 1
127.0.0.1:6379> msetnx k11 v11 k12 v12 k13 v13
(integer) 1
127.0.0.1:6379>
3.13 getrange 获取值得范围
相当于java中的substring [前包,后包]
127.0.0.1:6379> set name zhoumin
OK
127.0.0.1:6379> getrange name 0 3
"zhou"
127.0.0.1:6379>
3.14 setrange 设置值所存储的字符串
覆盖索引开始之后的值
127.0.0.1:6379> setrange name 4 xiao
(integer) 8
127.0.0.1:6379> get name
"zhouxiao"
127.0.0.1:6379>
3.15 setex 设置键值的同时设置过期时间秒
127.0.0.1:6379> setex age 20 value30
OK
127.0.0.1:6379> ttl age
(integer) 14
127.0.0.1:6379> ttl age
(integer) 12
127.0.0.1:6379> ttl age
(integer) 11
127.0.0.1:6379> ttl age
(integer) 10
127.0.0.1:6379>
3.16 getset 以新值替换旧值
getset
127.0.0.1:6379> getset name zhoumin
"zhouxiao"
127.0.0.1:6379> get name
"zhoumin"
127.0.0.1:6379>
3.17 String的数据结构总结
String 的数据结构为简单动态字符串。是可以修改的字符串,内部结构实现上类似于java的arraylist,采用预分配冗余空间的方式来减少内存的频繁分配。
4 Redis 列表List
单键多值 Redis 列表是简单的字符串列表,按照插入顺序排列,可以添加一个元素到列表的头部(左边)或者尾部(右边)
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
4.1 lpush 从左边插入一个或多个值
127.0.0.1:6379> lpush k1 v1 v2 v3
(integer) 3
4.2 lrange 从左边取出一个或多个值
lrange
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379>
4.3 rpush 从右边插入一个或多个值
127.0.0.1:6379> rpush k2 v1 v2 v3
(integer) 3
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379>
4.4 lpop 从左边吐出一个值
值在健在,值光键亡
127.0.0.1:6379> lpop k1
"v3"
127.0.0.1:6379> lrange k1 0 -1
1) "v2"
2) "v1"
127.0.0.1:6379>
4.5 rpop 从右边吐出一个值
值在健在,值光键亡
127.0.0.1:6379> rpop k1
"v1"
127.0.0.1:6379> lrange k1 0 -1
1) "v2"
127.0.0.1:6379>
4.6 rpoplpush 从k1列表右边吐出一个值插入到k2列表左边
127.0.0.1:6379> lrange k1 0 -1
1) "v2"
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> rpoplpush k1 k2
"v2"
127.0.0.1:6379> lrange k2 0 -1
1) "v2"
2) "v1"
3) "v2"
4) "v3"
127.0.0.1:6379>
4.7 lindex 按照索引下标获得元素(从左到右)
lindex
127.0.0.1:6379> lrange k2 0 -1
1) "v2"
2) "v1"
3) "v2"
4) "v3"
127.0.0.1:6379> lindex k2 0
"v2"
127.0.0.1:6379> lindex k2 1
"v1"
127.0.0.1:6379>
4.8 llen 获得列表的长度
127.0.0.1:6379> llen k2
(integer) 4
127.0.0.1:6379>
4.9 linsert 在值得后面插入值
linsert before 在value的前面插入newvalue的值
127.0.0.1:6379> linsert k2 before v1 zhoumin
(integer) 5
127.0.0.1:6379> lrange k2 0 -1
1) "v2"
2) "zhoumin"
3) "v1"
4) "v2"
5) "v3"
127.0.0.1:6379>
linsert after 在value的后面插入newvalue的值
27.0.0.1:6379> lpush k1 v1 v2 v3
(integer) 3
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> linsert k1 after v1 zhoumin
(integer) 4
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "v2"
3) "v1"
4) "zhoumin"
127.0.0.1:6379>
4.10 lrem 删除list中的指定元素
lrem 从左到右删除n个指定的元素
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "zhoumin"
3) "v2"
4) "v1"
5) "zhoumin"
127.0.0.1:6379> lrem k1 1 zhoumin
(integer) 1
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "v2"
3) "v1"
4) "zhoumin"
127.0.0.1:6379>
4.11 lset 将列表下标index的值替换成value
lset 下标从0开始,将下标为1的值替换为zhoumin
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "v2"
3) "v1"
4) "zhoumin"
127.0.0.1:6379> lset k1 1 zhoumin
OK
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "zhoumin"
3) "v1"
4) "zhoumin"
127.0.0.1:6379>
4.12 List的数据结构总结
List的数据结构为快速链表quickList
首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。
它将所有的元素挨在一起存储,分配的是一块连续的内存。
当数据量比较多的时候才会改成quicklist。
因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。
Redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速插入删除性能,又不会出现太大的空间冗余。
5 Redis 集合Set
Redis set 对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
Redis 的set 是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1).
一个算法,随着数据的增加,执行时间的长短,如果是O(1),数据增加,查找数据的时间不变。
5.1 sadd 添加元素
127.0.0.1:6379> sadd k1 v1 v2 v3
(integer) 3
127.0.0.1:6379> smembers k1
1) "v2"
2) "v1"
3) "v3"
5.2 smembers 取出集合中的元素
127.0.0.1:6379> smembers k1
1) "v2"
2) "v1"
3) "v3"
5.3 sismenber 判断集合中是否存在元素
sismember 存在返回1 不存在返回0
127.0.0.1:6379> sismember k1 v1
(integer) 1
127.0.0.1:6379> sismember k1 v11
(integer) 0
127.0.0.1:6379>
5.4 scard 返回集合中的元素个数
127.0.0.1:6379> scard k1
(integer) 3
127.0.0.1:6379>
5.5 srem 删除集合中的指定元素
127.0.0.1:6379> srem k1 v1 v2
(integer) 2
127.0.0.1:6379> smembers k1
1) "v3"
127.0.0.1:6379>
5.6 spop 随机从集合中取出一个值
元素即value全部取出之后则key也随即消失
127.0.0.1:6379> smembers k1
1) "v3"
127.0.0.1:6379> spop k1 1
1) "v3"
127.0.0.1:6379>
5.7 srandmember 随机从集合中取出n个值,不会从集合中删除
127.0.0.1:6379> smembers k1
1) "v2"
2) "v1"
3) "v3"
127.0.0.1:6379> srandmember k1 2
1) "v1"
2) "v3"
127.0.0.1:6379> srandmember k1 2
1) "v1"
2) "v2"
127.0.0.1:6379>
5.8 smove 将集合中的元素移动到另一个集合中
如果存在相同元素则源集合中元素消失,目标集合中元素不增加,体现set集合的唯一性,不存在重复元素,否则可以移动成功。
127.0.0.1:6379> sadd k2 v3 v4 v5
(integer) 3
127.0.0.1:6379> sadd k1 v1 v2 v3
(integer) 3
127.0.0.1:6379> smove k1 k2 v3
(integer) 1
127.0.0.1:6379> smembers k1
1) "v2"
2) "v1"
127.0.0.1:6379> smembers k2
1) "v5"
2) "v4"
3) "v3"
127.0.0.1:6379>
5.9 sinter 取出集合中的交集
127.0.0.1:6379> smembers k2
1) "v5"
2) "v4"
3) "v3"
127.0.0.1:6379> sadd k3 v4 v5 v6
(integer) 3
127.0.0.1:6379> smembers k3
1) "v5"
2) "v6"
3) "v4"
127.0.0.1:6379> sinter k2 k3
1) "v5"
2) "v4"
127.0.0.1:6379>
5.10 sunion 取出集合中的并集
127.0.0.1:6379> sunion k2 k3
1) "v5"
2) "v6"
3) "v3"
4) "v4"
127.0.0.1:6379>
5.11 sdiff 取出集合的差集
sdiff 返回两个集合的差集元素(key1中的,不包含key2中的)
127.0.0.1:6379> smembers k2
1) "v5"
2) "v4"
3) "v3"
127.0.0.1:6379> smembers k3
1) "v5"
2) "v6"
3) "v4"
127.0.0.1:6379> sdiff k2 k3
1) "v3"
127.0.0.1:6379>
5.12 Set集合数据结构总结
Set 数据结构是dict 字典,字典是用哈希表实现的。
java中的HashSet的内部实现使用的是HashMap,只不过所有的value 都指向同一个对象。
Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部结构。
6 Redis哈希(Hash)
Redis hash 是一个键值对集合
Redis hash 是一个string 类型的field 和value 的映射表,hash特别适合用于存储对象。
类似Java里面的Map<String,Object>
用户id为查找的key,存储的value 用户对象包含姓名、年龄、生日等信息,如果用普通的key/value结构来存储
6.1 hset 向hash中添加值
hset 给 集合中的 键赋值
[chengwen@localhost redis]$ redis-server /etc/redis.conf
[chengwen@localhost redis]$ redis-cli
127.0.0.1:6379> hset user:1001 id 1
(integer) 1
127.0.0.1:6379> hset user:1001 name zhoumin
(integer) 1
127.0.0.1:6379>
6.2 hget 从hash中取出值
hget 从集合取出value
127.0.0.1:6379> hget user:1001 id
"1"
127.0.0.1:6379> hget user:1001 name
"zhoumin"
127.0.0.1:6379>
6.3 hmset 批量设置hash值
127.0.0.1:6379> hmset user:1002 id 2 name zhangsan age 30
OK
127.0.0.1:6379>
6.4 hexists 查看哈希表key中,给定域field是否存在
返回 1 表示存在
127.0.0.1:6379> hexists user:1001 name
(integer) 1
127.0.0.1:6379>
6.5 hkeys 列出该hash集合的所有filed
127.0.0.1:6379> hkeys user:1002
1) "id"
2) "name"
3) "age"
127.0.0.1:6379>
6.6 hvals 列出该hash集合的所有value
127.0.0.1:6379> hvals user:1002
1) "2"
2) "zhangsan"
3) "30"
127.0.0.1:6379>
6.7 hincrby 为哈希表key中的域field 的值加上增量1
127.0.0.1:6379> hincrby user:1002 age 2
(integer) 32
127.0.0.1:6379>
6.8 hsetnx 将哈希表中key中的域field的值设置为value,当且仅当域field不存在
127.0.0.1:6379> hsetnx user:1002 age 35
(integer) 0
127.0.0.1:6379> hsetnx user:1002 gender 1
(integer) 1
127.0.0.1:6379> hkeys user:1002
1) "id"
2) "name"
3) "age"
4) "gender"
127.0.0.1:6379> hvals user:1002
1) "2"
2) "zhangsan"
3) "32"
4) "1"
127.0.0.1:6379>
6.9 Hash数据结构总结
Hash类型对应的数据结构是两种:ziplist压缩列表,hashtable(哈希表)。当field-value 长度较短且个数较少时,使用ziplist,否则使用hashtable。
7 Redis有序集合Zset(sorted set)
Redis 有序集合zset 与普通集合set非常相似,是一个没有重复元素的字符串集合。 不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复的。
因为元素是有序的,所以你也可以很快的根据句评分(score)或者次序(position)来获取一个范围的元素。
访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。
7.1 zadd 添加元素
将一个或多个member元素及score值加入到有序集key当中。
[chengwen@localhost redis]$ redis-server /etc/redis.conf
[chengwen@localhost redis]$ redis-cli
127.0.0.1:6379> zadd topn 200 java 300 c++ 400 mysql 500 php
(integer) 4
7.2 zrange 取出元素
取出元素不带评分scores
127.0.0.1:6379> zrange topn 0 -1
1) "java"
2) "c++"
3) "mysql"
4) "php"
127.0.0.1:6379>
取出元素带评分scores
127.0.0.1:6379> zrange topn 0 -1 withscores
1) "java"
2) "200"
3) "c++"
4) "300"
5) "mysql"
6) "400"
7) "php"
8) "500"
127.0.0.1:6379>
7.3 zrangebyscore 取出范围内的值
127.0.0.1:6379> zrangebyscore topn 300 500
1) "c++"
2) "mysql"
3) "php"
127.0.0.1:6379>
带评分的取出范围内的值
127.0.0.1:6379> zrangebyscore topn 300 500 withscores
1) "c++"
2) "300"
3) "mysql"
4) "400"
5) "php"
6) "500"
127.0.0.1:6379>
7.4 zrevrangebyscore 倒序取出范围元素
127.0.0.1:6379> zrevrangebyscore topn 500 200
1) "php"
2) "mysql"
3) "c++"
4) "java"
127.0.0.1:6379>
带评分的倒序取出范围内的值
127.0.0.1:6379> zrevrangebyscore topn 500 200 withscores
1) "php"
2) "500"
3) "mysql"
4) "400"
5) "c++"
6) "300"
7) "java"
8) "200"
127.0.0.1:6379>
7.5 zincrby 为元素的score加上增量
zincrby
increment 步长即增加多少
127.0.0.1:6379> zincrby topn 50 java
"250"
127.0.0.1:6379> zrevrangebyscore topn 500 200 withscores
1) "php"
2) "500"
3) "mysql"
4) "400"
5) "c++"
6) "300"
7) "java"
8) "250"
127.0.0.1:6379>
7.6 zrem 删除元素
127.0.0.1:6379> zrem topn php
(integer) 1
127.0.0.1:6379>
7.7 zconut 统计该集合分数区间下的元素个数
127.0.0.1:6379> zcount topn 200 300
(integer) 2
127.0.0.1:6379>
7.8 zrank 返回集合中的排名
127.0.0.1:6379> zrank topn java
(integer) 0
127.0.0.1:6379> zrange topn 0 -1
1) "java"
2) "c++"
3) "mysql"
127.0.0.1:6379> zrange topn 0 -1 withscores
1) "java"
2) "250"
3) "c++"
4) "300"
5) "mysql"
6) "400"
127.0.0.1:6379> zrank topn mysql
(integer) 2
127.0.0.1:6379>
7.9 Zset 数据结构总结
zset底层使用了两个数据结构
1)hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。
2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表
文章目录
-
- 1 基本知识
-
- 1.1 select 切换数据库
- 1.2 dbsize 查看当前数据库key的数量
- 1.3 flushdb 清空当前库
- 1.4 flushall 清空全部库(16个库)
- 1.5 端口6379由来
- 1.6 统一密码管理
- 1.7 单线程+多路IO复用
- 2 redis键(key)
-
- 2.1 keys * 查看当前库所有key(匹配:keys *1 )
- 2.2 exists key 查看库中是否存在key
- 2.3 type key 查看制定key的类型
- 2.4 del 删除key数据
- 2.5 unlink key 根据value选择非阻塞删除
- 2.6 expire key 10 为指定的key设置过期时间
- 2.7 ttl key 查看还有多少秒过期
- 3 Redis字符串
-
- 3.1 set 添加值
- 3.2 get 添加值
- 3.3 append 追加值
- 3.4 strlen 获取值得长度
- 3.5 setnx 互斥设置值
- 3.6 incr 将key中存储的值增加1
- 3.7 decr 将key中存储的值减1
- 3.8 incrby 将key中的值步长增加指定的值
- 3.9 decrby 将key中的值步长减少指定的值
- 3.10 mset 同时设置多个键值对
- 3.11 mget 同时获取多个键值对
- 3.12 msetnx 同时互斥设置多个键值对
- 3.13 getrange 获取值得范围
- 3.14 setrange 设置值所存储的字符串
- 3.15 setex 设置键值的同时设置过期时间秒
- 3.16 getset 以新值替换旧值
- 3.17 String的数据结构总结
- 4 Redis 列表List
-
- 4.1 lpush 从左边插入一个或多个值
- 4.2 lrange 从左边取出一个或多个值
- 4.3 rpush 从右边插入一个或多个值
- 4.4 lpop 从左边吐出一个值
- 4.5 rpop 从右边吐出一个值
- 4.6 rpoplpush 从k1列表右边吐出一个值插入到k2列表左边
- 4.7 lindex 按照索引下标获得元素(从左到右)
- 4.8 llen 获得列表的长度
- 4.9 linsert 在值得后面插入值
- 4.10 lrem 删除list中的指定元素
- 4.11 lset 将列表下标index的值替换成value
- 4.12 List的数据结构总结
- 5 Redis 集合Set
-
- 5.1 sadd 添加元素
- 5.2 smembers 取出集合中的元素
- 5.3 sismenber 判断集合中是否存在元素
- 5.4 scard 返回集合中的元素个数
- 5.5 srem 删除集合中的指定元素
- 5.6 spop 随机从集合中取出一个值
- 5.7 srandmember 随机从集合中取出n个值,不会从集合中删除
- 5.8 smove 将集合中的元素移动到另一个集合中
- 5.9 sinter 取出集合中的交集
- 5.10 sunion 取出集合中的并集
- 5.11 sdiff 取出集合的差集
- 5.12 Set集合数据结构总结
- 6 Redis哈希(Hash)
-
- 6.1 hset 向hash中添加值
- 6.2 hget 从hash中取出值
- 6.3 hmset 批量设置hash值
- 6.4 hexists 查看哈希表key中,给定域field是否存在
- 6.5 hkeys 列出该hash集合的所有filed
- 6.6 hvals 列出该hash集合的所有value
- 6.7 hincrby 为哈希表key中的域field 的值加上增量1
- 6.8 hsetnx 将哈希表中key中的域field的值设置为value,当且仅当域field不存在
- 6.9 Hash数据结构总结
- 7 Redis有序集合Zset(sorted set)
-
- 7.1 zadd 添加元素
- 7.2 zrange 取出元素
- 7.3 zrangebyscore 取出范围内的值
- 7.4 zrevrangebyscore 倒序取出范围元素
- 7.5 zincrby 为元素的score加上增量
- 7.6 zrem 删除元素
- 7.7 zconut 统计该集合分数区间下的元素个数
- 7.8 zrank 返回集合中的排名
- 7.9 Zset 数据结构总结