该笔记大部分搬运B站遇见狂神说的Redis,顺便把图文合并记录,便于回顾,仅用于学习!
视频地址:https://www.bilibili.com/video/BV1S54y1R7SB?t=250 作者真的非常好,记得三连
如有侵权,请联系删除!
1. 五大数据类型
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库
,高速缓存
和消息队列代理
。它支持字符串
、哈希表
、列表
、集合
、有序集合
,位图
,hyperloglogs
等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
2. Redis-key
在redis中无论什么数据类型,在数据库中都是以key-value形式保存,通过进行对Redis-key的操作,来完成对数据库中数据的操作。
下面学习的命令:
- exists key:判断键是否存在
- del key:删除键值对
- move key db:将键值对移动到指定数据库
- expire key second:设置键值对的过期时间
- type key:查看value的数据类型
在使用redis中忘记命令可以去官网查看命令:http://www.redis.cn/commands.html
3. String(字符串)
命令 | 描述 | 示例 |
---|---|---|
set key value | 设置 指定的key和value | 127.0.0.1:6379> set k1 v1 |
get key | 根据key获取 值 | 127.0.0.1:6379> get k1 |
append key value | 根据key对相应的值进行追加 ,如果key不存在,则创建新的key-value值 | 127.0.0.1:6379> append k1 “hello” |
incr key | 将指定key的value数值进行+1 (仅对于数字) | 127.0.0.1:6379> incr views |
decr key | 将指定key的value数值进行-1 (仅对于数字) | 127.0.0.1:6379> decr views |
incrby key | 按指定的步长对数值进行增加 | 127.0.0.1:6379> incrby views 10 |
decrby key | 按指定的步长对数值进行减少 | 127.0.0.1:6379> decrby views 10 |
getrange key start end | 根据范围获取字符串(截取字符串 )end为-1时获取全部的字符串 | 127.0.0.1:6379> getrange k1 0 3 127.0.0.1:6379> getrange k1 0 -1 |
setrange key index value | 根据位置替换字符串(替换字符串 ) | 127.0.0.1:6379> setrange k2 1 ff |
setex key seconds value | set 键值对并设置过期时间 | 127.0.0.1:6379> setex k2 30 “hello” |
setnx key value | 仅当key不存在时进行set | 127.0.0.1:6379> setnx k3 “redis” 127.0.0.1:6379> setnx k3 “mongodb” |
mset key value key value… | 批量set键值对 | 127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 127.0.0.1:6379> mset user:1:name “zhangsan” user:1:age 2 OK 127.0.0.1:6379> mget user:1:name user:1:age 1) "zhangsan" 2) “2” |
mget key key key … | 批量获取多个key保存的值 | 127.0.0.1:6379> mget k1 k2 k3 |
msetnx key value key value … | 批量设置键值对,仅当参数中所有的key都不存在时执行 | 127.0.0.1:6379> msetnx k1 v11 k2 v22 |
getset key value | 如果不存在值,则返回nil,如果存在值,获取原来的值,并设置新的值 |
String类似的使用场景:value除了是字符串还可以是数字,用途举例:
- 计数器
- 统计多单位的数量:uid:123666:follow 0
- 粉丝数
- 对象存储缓存
4. List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
List可以当成栈、队列、阻塞队列等。
前缀字母L或R代表方向,L代表是左边,R代表是右边。
命令 | 描述 | 示例 |
---|---|---|
lpush key element | 从左边向列表中PUSH值 (一个或者多个)。 | 127.0.0.1:6379> lpush list one (integer) 1 127.0.0.1:6379> lpush list two (integer) 2 127.0.0.1:6379> lpush list three (integer) 3 127.0.0.1:6379> lrange list 0 -1 1) "three" 2) "two" 3) "one" 127.0.0.1:6379> Lrange list 0 1 1) "three" 2) “two” |
rpush key element | 从右边向列表中PUSH值 (一个或者多个)。 | 127.0.0.1:6379> rpush list right (integer) 4 127.0.0.1:6379> lrange list 0 -1 1) "three" 2) "two" 3) "one" 4) “right” |
lrange list start end | 获取list 起止元素(索引从左往右 递增) | 127.0.0.1:6379> lrange list 0 1 1) "three" 2) "two" 127.0.0.1:6379> lrange list 0 -1 1) "three" 2) "two" 3) "one" 4) “right” |
lpop key | 移除 list的第一个 元素 | 127.0.0.1:6379> lrange list 0 -1 1) "three" 2) "two" 3) "one" 4) “right" 127.0.0.1:6379> lpop list "three” |
rpop key | 移除 list的最后一个 元素 | 127.0.0.1:6379> lrange list 0 -1 1) "two" 2) "one" 3) “right" 127.0.0.1:6379> rpop list "right” |
lindex key index | 通过索引获取列表元素 | 127.0.0.1:6379> lrange list 0 -1 1) "two" 2) “one" 127.0.0.1:6379> lindex list 0 "two" 127.0.0.1:6379> lindex list 1 "one” |
llen key | 查看列表长度 | 127.0.0.1:6379> lpush list one (integer) 1 127.0.0.1:6379> lpush list two (integer) 2 127.0.0.1:6379> lpush list three (integer) 3 127.0.0.1:6379> llen list (integer) 3 |
lrem key count value | List中是允许value重复的;count > 0 :从头部开始搜索 然后删除指定的value 至多删除count个;count < 0 :从尾部开始搜索,然后删除指定的valuecount = 0:删除列表中所有的指定value。 | 127.0.0.1:6379> lrange list 0 -1 1) "three" 2) "three" 3) "two" 4) "one" 127.0.0.1:6379> lrem list 1 one (integer) 1 127.0.0.1:6379> lrange list 0 -1 1) "three" 2) "three" 3) "two" 127.0.0.1:6379> lrem list 2 three (integer) 2 127.0.0.1:6379> lrange list 0 -1 1) “two” |
ltrim key start end | 通过下标截取 指定范围内的列表 | 127.0.0.1:6379> lrange mylist 0 -1 1) "hello1" 2) "hello2" 3) "hello3" 4) "hello4" 127.0.0.1:6379> ltrim mylist 1 2 OK 127.0.0.1:6379> lrange mylist 0 -1 1) "hello2" 2) “hello3” |
rpoplpush source destination | 将列表的尾部(右)最后一个值弹出,并返回,然后加到另一个列表的头部 | 127.0.0.1:6379> lrange mylist 0 -1 1) "hello1" 2) "hello2" 3) “hello3" 127.0.0.1:6379> rpoplpush mylist myotherlist "hello3” |
exists key | 判断列表是否存在 | 127.0.0.1:6379> exists mylist (integer) 1 |
lset key index value | 通过下标更新或替换 列表指定的值 | 127.0.0.1:6379> lrange mylist 0 -1 1) "hello1" 2) "hello2" 127.0.0.1:6379> lset mylist 1 item OK 127.0.0.1:6379> lrange mylist 0 -1 1) "hello1" 2) “item” |
linsert key before|after pivot value | 在指定列表元素的前/后 插入value | 127.0.0.1:6379> lrange mylist 0 -1 1) "hello1" 2) "item" 127.0.0.1:6379> linsert mylist before item hello2 (integer) 3 127.0.0.1:6379> lrange mylist 0 -1 1) "hello1" 2) "hello2" 3) “item” |
小结:
- 它实际上是一个链表,before Node after , left, right 都可以插入值
- 如果key不存在,则创建新的链表
- 如果key存在,新增内容
- 如果移除了所有值,空链表,也代表不存在
- 在两边插入或者改动值,效率最高!修改中间元素,效率相对较低
应用:
- 消息排队!消息队列(Lpush Rpop),栈(Lpush Lpop)
5. Set(集合)
Redis 的 Set 是 string 类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
命令 | 描述 | 示例 |
---|---|---|
sadd key member | 向集合中无序增加一个/多个成员 | 127.0.0.1:6379> sadd myset “hello1” (integer) 1 127.0.0.1:6379> sadd myset “hello2” (integer) 1 127.0.0.1:6379> sadd myset “hello3” (integer) 1 127.0.0.1:6379> sadd myset “hello4” (integer) 1 |
smembers key | 查看指定set的所有值 | 127.0.0.1:6379> smembers myset 1) "hello4" 2) "hello3" 3) "hello1" 4) “hello2” |
sismember key member | 返回集合中所有的成员 | 127.0.0.1:6379> sismember myset hello (integer) 0 127.0.0.1:6379> sismember myset hello1 (integer) 1 |
scard key | 获取集合的成员数 | 127.0.0.1:6379> scard myset (integer) 4 |
srem key member | 移除集合中一个/多个成员 | 127.0.0.1:6379> smembers myset 1) "hello4" 2) "hello3" 3) "hello1" 4) "hello2" 127.0.0.1:6379> srem myset “hello1” (integer) 1 127.0.0.1:6379> smembers myset 1) "hello4" 2) "hello3" 3) “hello2” |
srandmember key [count] | 随机返回集合中count个成员,count缺省值为1 | 127.0.0.1:6379> SRANDMEMBER myset "hello4" 127.0.0.1:6379> srandmember myset 2 1) "hello4" 2) “hello2” |
spop key [count] | 随机移除并返回集合中count个成员,count缺省值为1 | 127.0.0.1:6379> smembers myset 1) "hello4" 2) "hello3" 3) "hello2" 127.0.0.1:6379> spop myset "hello3" 127.0.0.1:6379> smembers myset 1) "hello4" 2) “hello2” |
smove source destination member | 将source集合的成员member移动到destination集合 | 127.0.0.1:6379> smembers myset 1) "hello4" 2) "hello2" 127.0.0.1:6379> smembers myset2 1) "hello5" 127.0.0.1:6379> smove myset myset2 “hello2” (integer) 1 127.0.0.1:6379> smembers myset2 1) "hello5" 2) “hello2” |
sdiff key[key2…] | 返回所有集合的差集 key1- key2 - … | 127.0.0.1:6379> sadd key1 a (integer) 1 127.0.0.1:6379> sadd key1 b (integer) 1 127.0.0.1:6379> sadd key1 c (integer) 1 127.0.0.1:6379> sadd key2 c (integer) 1 127.0.0.1:6379> sadd key2 d (integer) 1 127.0.0.1:6379> sadd key2 e (integer) 1 127.0.0.1:6379> sdiff key1 key2 1) "a" 2) “b” |
sinter key[key2…] | 返回所有集合的交集 | 127.0.0.1:6379> sadd key1 a (integer) 1 127.0.0.1:6379> sadd key1 b (integer) 1 127.0.0.1:6379> sadd key1 c (integer) 1 127.0.0.1:6379> sadd key2 c (integer) 1 127.0.0.1:6379> sadd key2 d (integer) 1 127.0.0.1:6379> sadd key2 e (integer) 1 127.0.0.1:6379> sinter key1 key2 1) “c” |
sunion key[key2…] | 返回所有集合的并集 | 127.0.0.1:6379> sadd key1 a (integer) 1 127.0.0.1:6379> sadd key1 b (integer) 1 127.0.0.1:6379> sadd key1 c (integer) 1 127.0.0.1:6379> sadd key2 c (integer) 1 127.0.0.1:6379> sadd key2 d (integer) 1 127.0.0.1:6379> sadd key2 e (integer) 1 127.0.0.1:6379> sunion key1 key2 1) "c" 2) "a" 3) "b" 4) "e" 5) “d” |
应用场景:
- 共同好友
- 共同爱好
- 共同关注
- 推荐好友
- 二度好友
6. Hash(哈希)
Redis hash 是一个键值
(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
命令 | 描述 | 示例 |
---|---|---|
hset key field value | 将哈希表 key 中的字段 field 的值设为 value 。重复设置同一个field会覆盖,返回0 | 127.0.0.1:6379> hset myhash key value (integer) 1 |
hget key field value | 获取存储在哈希表中指定字段的值 | 127.0.0.1:6379> hget myhash key "value" |
hgetall key | 获取在哈希表key 的所有字段和值 | 127.0.0.1:6379> hset myhash key value (integer) 1 127.0.0.1:6379> hgetall myhash 1) "key" 2) “value” |
hkeys key | 获取哈希表key中所有的字段 | 127.0.0.1:6379> hkeys myhash 1) “key” |
hvals key | 获取哈希表中所有值 | 127.0.0.1:6379> hvals myhash 1) “value” |
hlen key | 获取哈希表中字段的数量 | 127.0.0.1:6379> hlen myhash (integer) 1 |
hexists key | 查看哈希表 key 中,指定的字段是否存在。 | 127.0.0.1:6379> hexists myhash key (integer) 1 #存在 127.0.0.1:6379> hexists myhash key1. (integer) 0 #不存在 |
hmset key field1 value1 [field2 value2…] | 同时将多个 field-value (域-值)对设置到哈希表 key 中。 | 127.0.0.1:6379> hmset myhash k1 v1 k2 v2 k3 v3 OK 127.0.0.1:6379> hgetall myhash 1) "key" 2) "value" 3) "k1" 4) "v1" 5) "k2" 6) "v2" 7) "k3" 8) “v3” |
hmget key field1 [field2…] | 获取所有给定字段的值 | 127.0.0.1:6379> hmget myhash k1 k2 1) "v1" 2) “v2” |
hsetnx key field value | 只有在字段 field 不存在时,设置哈希表字段的值。 | 127.0.0.1:6379> hsetnx myhash k1 val1 (integer) 0 127.0.0.1:6379> hget myhash k1 "v1" 127.0.0.1:6379> hsetnx myhash k4 v4 (integer) 1 127.0.0.1:6379> hget myhash k4 "v4" |
hdel key field1 [field2…] | 删除哈希表key中一个/多个field字段 | 127.0.0.1:6379> hdel myhash k3 k4 (integer) 2 127.0.0.1:6379> hgetall myhash 1) "key" 2) "value" 3) "k1" 4) "v1" 5) "k2" 6) “v2” |
hincrby key field n | 按指定的步长对数值进行增加,为哈希表 key 中的指定字段的整数值加上增量n,并返回增量后结果 一样只适用于整数型字段 | 127.0.0.1:6379> hset myhash k5 5 (integer) 1 127.0.0.1:6379> hincrby myhash k5 2 (integer) 7 127.0.0.1:6379> hget myhash k5 "7" |
hincrbyfloat key field n | 为哈希表 key 中的指定字段的浮点数值加上增量 n。 | 127.0.0.1:6379> hset myhash k6 15.2 (integer) 1 127.0.0.1:6379> hincrbyfloat myhash k6 0.4 "15.6" 127.0.0.1:6379> hget myhash k6 "15.6" |
应用场景:
- Hash变更的数据user name age,尤其是用户信息之类的,经常变动的信息!Hash更适合于对象的存储,Sring更加适合字符串存储!
7. Zset(有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
命令 | 描述 | 示例 |
---|---|---|
zadd key score member1 [score2 member2] | 添加多个值 | 127.0.0.1:6379> zadd myzset 1 one (integer) 1 127.0.0.1:6379> zadd myzset 2 two (integer) 1 127.0.0.1:6379> zadd myzset 3 three (integer) 1 127.0.0.1:6379> zrange myzset 0 -1 1) "one" 2) "two" 3) “three” |
zcard key | 获取有序集合的成员数 | 127.0.0.1:6379> zcard myzset (integer) 3 |
zrange[byscore/bylex] key min max | 通过索引区间返回有序集合成指定区间内的成员(从小到大排序 ) | 127.0.0.1:6379> zrange salary 0 -1 1) "wangwu" 2) "zhangsan" 3) “lisi” |
zrevrange[byscore/bylex] key min max | 通过索引区间返回有序集合成指定区间内的成员(从大到小排序 ) | 127.0.0.1:6379> zrevrange salary 0 -1 1) "lisi" 2) "zhangsan" 3) “wangwu” |
zrevrangebyscore[lex] key max min [withscores] | 返回有序集中指定分数区间内的成员,分数从高到低排序 | 127.0.0.1:6379> zrevrangebyscore salary 5000 0 1) "lisi" 2) "zhangsan" 3) "wangwu" 127.0.0.1:6379> zrevrangebyscore salary 5000 0 withscores 1) "lisi" 2) "5000" 3) "zhangsan" 4) "2500" 5) "wangwu" 6) “500” |
zrem key member[member…] | 移除 有序集合中一个/多个成员 | 127.0.0.1:6379> zrange salary 0 -1 1) "wangwu" 2) "zhangsan" 3) "lisi" 127.0.0.1:6379> zrem salary wangwu (integer) 1 127.0.0.1:6379> zrange salary 0 -1 1) "zhangsan" 2) “lisi” |
zcard key | 获取有序集合中的个数 | 127.0.0.1:6379> zrange salary 0 -1 1) "zhangsan" 2) "lisi" 127.0.0.1:6379> zcard salary (integer) 2 |
zcount key min max | 获取区间的成员数量 | 127.0.0.1:6379> zrange salary 0 -1 1) "wangwu" 2) "zhangsan" 3) "lisi" 127.0.0.1:6379> zcount salary 500 5000 (integer) 3 127.0.0.1:6379> zcount salary 500 2500 (integer) 2 |
应用案例:
- set排序 存储班级成绩表 工资表排序!
- 普通消息,1.重要消息 2.带权重进行判断
- 排行榜应用实现,取Top N测试