共计 3011 个字符,预计需要花费 8 分钟才能阅读完成。
一. 全局命令
1. 查看所有键:keys *
2. 键总数 dbsize // 若存在大量键, 一般线上不建议使用此命令
3. 检查键是否存在:exists key // 存在返回 1, 不存在返回 0
4. 删除键:del key // 返回删除键个数, 不存在返回 0,del key key1 则是删除两个键
5. 键过期:expire key seconds //expire name 5 表示 5 秒后过期 ttl 查看剩余的过期时间
6. 键的数据结构类型:type key // 返回 string,hash,list,set,zset。
二. 数据结构
1.String 字符串:
常见字符串, 还有数字,浮点型, 整形, 二进制字节数组, 最大不超过 512MB。
1.1 设置命令:
a:set name mike px 1000// 设置 1000 毫秒过期,ex 10 则是 10 秒过期
b:setnx name xiaoming //setnx 即 set if not exist, 键不存在时, 返回 1 设置成功, 键存在则设置失败返回 0。
应用场景: 分布式锁, 多个客户端同时指向 setnx 只有一个能设置成功.
c: 批量设置
- mset city shenzhen guangzhou // 批量设置值,m 即 more many 多个的意思.
- mget city shenzhen guangzhou// 批量获取值
d: 计数:
- incr age // 键值 age 整数自加 1,非整数返回错误, 键不存在则从 0 自增返回 1
- decr age // 键值 age 整数减 1
- incrby age 3 // 整数 +3
- decrby age 2 // 整数 -2
- incrbyfloat money 2.1 // 浮点型 monet+2.1
e:append 追加命令:
set name hello;append name world // 追加后变成 helloworld
f: 字符串长度
set name “ 名字 ”;strlen hello // 结果 6, 每个中午占 3 个字节
g: 截取字符串:
set name helloworld;getrange name 0 2 // 返回 hel, 0 - 1 则是返回全部
2.hash(哈希)
哈希 hash 是一个 string 类型的 field 和 value 的映射表,hash 适合用于存储对象。
- 设值:hset user:1 phone 13590248076 // 成功返回 1, 失败返回 0
- 取值:hget user:1 phone // 返回 135…
- 删除:hdel user:1 // 返回删除的个数
- 计算个数:hset user:1 name xiaoming;hset user:1 phone 13590248047; hlen user:1// 返回 2, 即 hash 中有 2 个属性
- 批量设值:hmset user:2 name xiaoming phone 13590248047 age 20 //hash 中设值三个值返回 OK
- 判断 hash 是否存在键值:hexists user:2 name // 存在返回 1, 不存在返回 0
- 获取 hash 所有的键 field:hkeys user:2 // 返回 name phone age 三个字段
- 获取 hash 所有键对应的值 value:hvals user:2 // 返回 xiaoming 13590248047 20
- 获取 hash 所有的 field 和 value:hgetall user:2// 返回 name phone age xiaoming 13590248047 20 6 个值
- hash 的指定 field 的 value 增加 1:hincrby user:2 age 1//age+1,同样的浮点型也可以
小结:基于 String 类型及 hash 类型都是可以存储数据库的数据, 有如下三种方案。
1. 原生:
set user:1 name xxx;
set user:1:age 20;
set user:1:phone 135xxxxxxxx;
优点:简单明了, 每个键对应一个值
缺点: 键数过多, 占用内存多, 数据过于分散
2. 将对象序列化后放入 redis:
如:set user:1 {“name”:”xiaoming”,”age”:20,”phone”:”135xxxxxxxx”}
优点: 编程简单, 若使用序列化合理内存使用率高
缺点:序列化和反序列化有一定的开销影响性能, 修改数据是查出来反序列化修改后再序列化存入 redis.
3. 使用 hash:
hmset user:1 name xiaoming age 20 phone 135xxxxxxxx
优点:简单直观, 使用合理可减少内存消耗
缺点:要控制 ziplist 和 hashtable 两种编码转换, 且 hashtable 消耗更多内存。(具体可再查阅资料)
3.list(列表)
用来存储多个有序的字符串, 一个列表最多可存 2 的 32 次方减 1 个元素。列表元素可以重复,有序列表因此是可以通过索引下标查询元素或者某个范围内元素。
特性如图:主要是有左边进入(添加到 list), 左边出来(list 中删除元素), 右边进入, 右边出来。
添加命令:
- rpush user:2 q w e r // 从右到左插入 qwer, 返回 4
- lrange user:2 0 -1 // 从第 0 位即左边开始获取所有元素返回 qwer
- lpush key a b c // 从左到右插入 abc,lrange key 0 - 1 则返回 c b a
- linsert key before b test// 在 b 之前插入 test,after 则是之后插入,lrange key 0 - 1 则返回 c test b a
查找命令:
- lrange key start end // 索引下标特点: 从左到右为 0 到 N -1
- lindex key -1// 返回最右边的元素,- 2 返回从右边起第二个元素
- llen key // 返回当前列表长度
- lpop key // 把最左边的第一个元素删除
- rpop key // 把最右边第一个元素删除
list 常应用于队列 (先进先出) 及栈(后进先出)
4. 集合 set
保存多个元素, 与列表不一样的是不允许有重复元素, 且集合是无序, 一个集合最多存储 2 的 32 次方减 1 个元素,与其他数据结构相比除了增删改查还支持集合交集丶并集丶差集。
集合 set 命令:
- exists name // 检查 name 键值是否存在
- sadd name a b c // 向 name 插入 3 个元素, 返回 3
- sadd name a b d // 再向 name 插入 abd,因为 a b 已经存在,返回 1
- smembers name // 获取 name 的所有元素, 返回结果无序
- srem name a // 返回 1 删除 a 元素
- scard name // 计算元素个数,返回个数
集合 set 使用场景:
社交圈,标签,共同关注,兴趣推测等等。
原理:都是取交集并集差集的,比如共同关注那就是取两者的交集;QQ 你可能认识的人取的是你和好友之间的差集。
备注:若这些用数据库来做是行不通的,效率会很差,使用 redis 则很轻易解决这种问题。
5. 有序集合 zset
在集合的基础上排序,即是应用于不能有重复的元素又需要排序. 常用于点击排行榜,点赞数,投票等等。
命令:
- zadd key score member //score 为 float 类型表示分数,member 及集合元素, 即每个元素有对应的分数, 可一次设置多个,zadd game 85 mike 98.5 mary 则是返回 2
- zrange game 0 -1 withscores // 查看分数与成员名
- zcard game // 计算成员个数
排名场景:
- zadd user:1 200 me 150 she 100 he // 插入数据
- zrange user:1 0 -1 withscores // 查看成员和分数
- zank user:1 me //200 是排在第三名, 从 0 开始算起, 因此返回 2
- zrevrank user:1 me // 返回 0, 反排序,可应用于点赞数, 最多的排最前