文章目录

  • 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基本知识相关推荐

  1. 技术实践|Redis基础知识及集群搭建(上)

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.本篇文章围绕Redis基础知识及集群搭建相关内容进行了分享,希 ...

  2. Redis缓存知识-穿透、击穿、雪崩

    目录 一.Redis介绍 二.Redis做缓存服务器 三.缓存穿透&击穿&雪崩 1.缓存穿透 2.缓存击穿 3.缓存雪崩 大家好,我是杨叔.每天进步一点点,关注我的微信公众号[程序员杨 ...

  3. Redis学习 - NoSQL简介、redis安装、redis基础知识、数据类型、持久化、订阅发布、主从复制、哨兵模式、缓存击穿和雪崩

    学习视频地址:https://www.bilibili.com/video/BV1S54y1R7SB 完结撒花,感谢狂神 文章目录 1. NoSQL 1.1 单机Mysql的演进 1.2 当今企业架构 ...

  4. Redis重点知识整理 -奔波儿东

    Redis重点知识整理 -奔波儿东 一.Redis简介: 1.什么是Redis? Redis(Remote Dictionary Server)是一个用c语言写的,开源的.高性能非关系型数据库.NoS ...

  5. Redis基础知识入门

    Redis快速入门 博主关于Redis高级特性的一些讲解,传送地址如下: 删除策略与淘汰策略详解 主从复制详解 哨兵模式详解 集群详解 缓存预热 & 缓存雪崩 & 缓存击穿 & ...

  6. 50 个 Redis 必备知识:基础知识,架构、调优和监控知识及难点解决

    本文包括:30 个 Redis 基础知识:10个 Redis 架构和运维必懂的知识:Redis 调优.监控知识和10个具体应用难点. 30 个 Redis 基础知识 1.Redis支持哪几种数据类型? ...

  7. Redis基础知识总结概述

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  8. [Redis6]Redis相关知识介绍

    Redis介绍相关知识 端口6379 6379 是 "MERZ " 九宫格输入法对应的数字.Alessia Merz 是一位意大利舞女.女演员. Redis 作者 Antirez ...

  9. Redis基础知识+安装+常用命令使用

    Redis NoSql概述 为什么用NoSql 单机MySQL的时代! 上古90年代,更多的是静态网页,动态交互类型的网站不多.一个基本网站访问量一般不会太大,单个数据库可以轻松应付. 现如今的大数据 ...

最新文章

  1. Linux下图解minicom安装
  2. 神“脑补”!只要一段话,就知道你的说话手势 | UC伯克利
  3. 【运筹学】线性规划 人工变量法 ( 人工变量法案例 | 第一次迭代 | 中心元变换 | 检验数计算 | 选择入基变量 | 选择出基变量 )
  4. 模拟摇奖:从1-36中随机抽出8个不重复的数字
  5. 1086 就不告诉你
  6. blockly和Java交互_blockly 基础学习(一)
  7. 铁乐学Python_day09_函数
  8. Maven学习总结(37)——利用GitHub或阿里云OSS对象存储、又拍云、七牛云存储等搭建个人Maven仓库
  9. python_day24_class_类_继承
  10. 【排序】LeetCode 75. Sort Colors
  11. vue 父组件调用子组件内置方法
  12. AppScan 下载地址
  13. VMware网络配置基础
  14. Reactor3 Mono
  15. 将.bat文件设置为Window系统开机自启动项
  16. BUUCTF 荷兰宽带数据泄露
  17. JVM_0.5_小故事
  18. 史上最搞笑的程序员段子,有图有真相!
  19. [艾兰岛]菜鸟用编辑器做传送门——kura酱长期更新
  20. 思维导图 XMind 闯关之路(第01关)新建文件 建立分支

热门文章

  1. 基于若依框架的二次开发_SAP Commerce(原Hybris)的订单处理框架和SAP CRM One Order框架...
  2. linux 线程_浅谈Linux线程模型
  3. PHP登录带图片,PHP登录注册完整图片验证码实现
  4. java面向对象编程考试题,202514HJava面向对象编程答案试题题目及答案,期末考试题库,章节测验答案...
  5. 信息采集软件测试,Telegraf采集CPU数据,测试派详解
  6. python编码-python中处理中文编码问题
  7. C语言实验 圆周率1193,【圆周率】小数点后10000位,4个4个分,你能找到那些配对?...
  8. mysql key_block_size_Mysql入门mysql Key_buffer_size参数的优化设置
  9. mplus 软件_Mplus 8.3 Combo Version 多元统计分析软件(Win)
  10. 支付宝服务商子商户_支付宝推广数字化经营服务商应该怎么做?