一.全局命令

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的长度:hlen user:2
  • 获取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中删除元素),右边进入,右边出来。

image.png

添加命令:

  • 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

在集合的基础上排序,即是应用于不能有重复的元素又需要排序.常用于点击排行榜,点赞数,投票等等。

image.png

命令:

  • 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,反排序,可应用于点赞数,最多的排最前

y猪
246 声望25 粉丝