一.全局命令
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中删除元素),右边进入,右边出来。
添加命令:
- 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,反排序,可应用于点赞数,最多的排最前
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。