2 Redis基本知识
文章目录
- 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 切换数据库
默认16个数据库,下标从0开始,使用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 数据结构总结
2 Redis基本知识相关推荐
- 技术实践|Redis基础知识及集群搭建(上)
Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.本篇文章围绕Redis基础知识及集群搭建相关内容进行了分享,希 ...
- Redis缓存知识-穿透、击穿、雪崩
目录 一.Redis介绍 二.Redis做缓存服务器 三.缓存穿透&击穿&雪崩 1.缓存穿透 2.缓存击穿 3.缓存雪崩 大家好,我是杨叔.每天进步一点点,关注我的微信公众号[程序员杨 ...
- Redis学习 - NoSQL简介、redis安装、redis基础知识、数据类型、持久化、订阅发布、主从复制、哨兵模式、缓存击穿和雪崩
学习视频地址:https://www.bilibili.com/video/BV1S54y1R7SB 完结撒花,感谢狂神 文章目录 1. NoSQL 1.1 单机Mysql的演进 1.2 当今企业架构 ...
- Redis重点知识整理 -奔波儿东
Redis重点知识整理 -奔波儿东 一.Redis简介: 1.什么是Redis? Redis(Remote Dictionary Server)是一个用c语言写的,开源的.高性能非关系型数据库.NoS ...
- Redis基础知识入门
Redis快速入门 博主关于Redis高级特性的一些讲解,传送地址如下: 删除策略与淘汰策略详解 主从复制详解 哨兵模式详解 集群详解 缓存预热 & 缓存雪崩 & 缓存击穿 & ...
- 50 个 Redis 必备知识:基础知识,架构、调优和监控知识及难点解决
本文包括:30 个 Redis 基础知识:10个 Redis 架构和运维必懂的知识:Redis 调优.监控知识和10个具体应用难点. 30 个 Redis 基础知识 1.Redis支持哪几种数据类型? ...
- Redis基础知识总结概述
redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...
- [Redis6]Redis相关知识介绍
Redis介绍相关知识 端口6379 6379 是 "MERZ " 九宫格输入法对应的数字.Alessia Merz 是一位意大利舞女.女演员. Redis 作者 Antirez ...
- Redis基础知识+安装+常用命令使用
Redis NoSql概述 为什么用NoSql 单机MySQL的时代! 上古90年代,更多的是静态网页,动态交互类型的网站不多.一个基本网站访问量一般不会太大,单个数据库可以轻松应付. 现如今的大数据 ...
最新文章
- Linux下图解minicom安装
- 神“脑补”!只要一段话,就知道你的说话手势 | UC伯克利
- 【运筹学】线性规划 人工变量法 ( 人工变量法案例 | 第一次迭代 | 中心元变换 | 检验数计算 | 选择入基变量 | 选择出基变量 )
- 模拟摇奖:从1-36中随机抽出8个不重复的数字
- 1086 就不告诉你
- blockly和Java交互_blockly 基础学习(一)
- 铁乐学Python_day09_函数
- Maven学习总结(37)——利用GitHub或阿里云OSS对象存储、又拍云、七牛云存储等搭建个人Maven仓库
- python_day24_class_类_继承
- 【排序】LeetCode 75. Sort Colors
- vue 父组件调用子组件内置方法
- AppScan 下载地址
- VMware网络配置基础
- Reactor3 Mono
- 将.bat文件设置为Window系统开机自启动项
- BUUCTF 荷兰宽带数据泄露
- JVM_0.5_小故事
- 史上最搞笑的程序员段子,有图有真相!
- [艾兰岛]菜鸟用编辑器做传送门——kura酱长期更新
- 思维导图 XMind 闯关之路(第01关)新建文件 建立分支
热门文章
- 基于若依框架的二次开发_SAP Commerce(原Hybris)的订单处理框架和SAP CRM One Order框架...
- linux 线程_浅谈Linux线程模型
- PHP登录带图片,PHP登录注册完整图片验证码实现
- java面向对象编程考试题,202514HJava面向对象编程答案试题题目及答案,期末考试题库,章节测验答案...
- 信息采集软件测试,Telegraf采集CPU数据,测试派详解
- python编码-python中处理中文编码问题
- C语言实验 圆周率1193,【圆周率】小数点后10000位,4个4个分,你能找到那些配对?...
- mysql key_block_size_Mysql入门mysql Key_buffer_size参数的优化设置
- mplus 软件_Mplus 8.3 Combo Version 多元统计分析软件(Win)
- 支付宝服务商子商户_支付宝推广数字化经营服务商应该怎么做?