Redis基本命令
引言:
在前一篇文章中,提到Redis键值对的存储方式支持多种数据类型的存储:key-----vlaue(String类型、set类型、list类型、hash类型、zset类型)
key1 | String类型的数据 |
key2 | set类型的数据,特点:无序、不可重复 |
key3 | list类型的数据,特点:有序、可重复 |
key4 | hash类型的数据,特点:相当于在value里又存了一个map,存放键值对维护的数据,当然了,这个作为value的map的value还可以存放map |
key5 | zset类型的数据,特点:有序的set、不可重复 |
一、关于key的命令
redis-server /myredis/redis.conf:后台启动Redis服务
redis-cli:打开redis客户端
①、查询、删除key
②、key的保质期
③、查看key的数量、清空数据库
如果不小心删除了公司里的缓存数据库可咋整?跑路吗?其实通过持久化的一些操作可以恢复
二、五大数据类型之String
String类型极其重要,因为在日常工作中,操作的数据类型百分之七八十都是String类型。你可能会产生疑问?String只能存字符串并且日常工作中基本都是字符串,那视频图片文件怎么存呢?这里就要提一提String的二进制安全问题:这意味着你可将图片或者视频等文件序列化成二进制文件保存在value串中,然后通过反序列化取出来正常使用,很神奇吧,但这也是有限制的:一个Redis的字符串value最多可以是512M。
基本命令:
得益于Redis的单线程,redis的但命令是原子性的,比如这里的incr 和decr ,这不同于java中的i++和i--在java中分为取值,操作,赋值三步,而这三步在多线程情况下是有可能被打断的。
批量添加获取命令:
1、mset key1 value1 k2 value2....:同时设置以一个或多个key-value对
2、mget key1 key2...:同时获取一个或多个value
3、msetnx key1 value1 k2 value2....同时设置一个或多个key-value对,当且仅当所有给抵挡的key都不存在。如果设置的键值对有的存在,有的不存在,那么命令就会执行失败,原因在于命令的原子性,要成功都成功,要失败都失败。
4、getrange key 起始位置 结束位置:用于获取指定范围内的值,类似于java中的substring方法,但也是有点区别的,java中左闭右开,这里都是闭区间。
5、setrange key 起始位置 value :用指定的value复写key所存储的字符串值,从起始位置开始写。
6、setex key 过期时间 value:设置键值对同时指定过期时间,单位为秒:setex k7 60 v7
但是在较新的版本中,set命令后面还可以跟别的命令。这个可以用XShell后面的提示看出来:
7、getset key value :以旧换新,设置新值的同时获得旧值,看命令就能直白理解:先get再set
三、五大数据类型之List
Redis通过List实现了单键多值,Redis列表是简单的字符串列表,按照插入顺序,你可以添加一个元素到表的头部或者尾部。他的底层实际上是一个双向链表,对两端的操作性能很高,但是通过索引下标操作中间的节点性能会比较差。
1、lpush/rpush key value1 value2 vlaue3 vlaue4 ......:从左边/右边插入一个或多个值。
如果不知道list的长度,可以使用 lrange l1 0 -1 来表示全查询。
2、lpop/rpop key :从左边或者右边pop出一个值
3、rpoplpush key1 key2 : 从key1列表的右边pop出一个值,插到key2列表的左边
4、获取list元素和长度、插入删除
lrange key startindex stopindex:获取指定范围内的元素
lindex key index:获取指定索引的元素
llen key : 获取列表的长度
linsert key before value newvalue :就value值前面插入一个新值newvalue。当有多个相同的值时,只往从左向右第一个value前插入一个newvalue
lrem key n value :从左边删除n个value
四、五大数据类型之set
Redis的set对外提供的功能与list类似,是一个列表的功能,其特殊之处在于,list中保存的数据是按照插入顺序排放的,但是set会对插入的数据进行重新排序,导致与插入的顺序不一致。当你希望存储一个列表数据,又不希望出现重复数据时,可以选择使用set。而且set提供了判断某个成员是否在set中的重要接口,这是list所没有功能。
Redis的set是String类型的无序集合,他底层是一个value为null的hash表,所以添加、删除、查找的时间复杂度都是O(1)。
1)sadd key value1 value2 ...
将一个或多个member元素加入到几个key中,没加入一个元素都会计算hash值,并与以保存的数据进行比较,当两者的hash值进行比较,如果相同,则不添加。
2)smembers key
取出该集合中所有的值
3)sismember key value
判断集合key中是否含有指定的value值,有则返回1,无则返回0.
4)scard key
返回该集合中元素的个数
5)srem key value1 value2...
删除集合中指定的一个或多个元素
6)spop key
随机从该集合中pop出一个元素
7)srandmember key n
随机从该集合中读出n个元素【不会删除读出的元素】
8)sinter key1 key2...
返回多个集合的交集元素
9)sunion key1 key2...
返回多个集合的并集元素
10)sdiff key1 key2...
返回多个集合的差集元素,但是他这个差集只取放在前面的key的差集元素:
五、五大数据类型之hash
在前面提到:作为Redis的键值对的value的hash类型的值,本身也是一个键值对集合,给人一种多维数据的感觉。hash是一个String类型的field和value的映射表,哈市特别适合存储对象,类似于java中的Map<String,Object>.
0101 | hash |
0202 | hash |
------------------------------------------------------------->
name | zhangsan |
age | 24 |
sex | male |
1)hset key field value :给key中field键赋值value
2)hget key field :从key集合中取出filed属性的值
3)hmset key field1 value1 field2 value2...... :批量设置hash的值
hmset 0202 name lisi age 23 sex female
4)hexists key field :判断哈希表key中,给定域field是否存在
5)hkeys key :列出该hash表中所有的field
6)hvals key :列出该hash表中所有的值
7)hincrby key field increment :为指定hash表中的指定filed加上增量increment,前提是此field的value是数zi
8)hsetnx key filed value :为指定hash表添加指定field和指定的value,同理当所指定的field已经存在时,操作失败!
六、五大数据类型之zset(sorted set)
Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每一个成员都关联了一个评分,这个评分被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复的。
因为元素时有序的,所以你可以很快的根据评分或者次序来获取一个范围内的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的是能列表。
1)zadd key score1 va score2 v2...... :将一个或多个member元素及其score值加入到有序可以中。
2)zrange key start stop [withscores]
返回有序集key中,下标在start ~ stop之间的元素,带上withscores,可以让分数一起和值返回到结果集中。
3)zrangebyscore key min max withscores limit offset count
返回有序集key中,所有score值介于min和max之间(包括等于min或者max的)的成员。有序集成员按照score值递增(从小到大)次序排列。
4)zrevrangebyscore key max min withscores limit offset count
原理同上,改为从大到小排列
5)zincrby key increment value :为指定成员value的score加上增量
6)zrem key value :删除指定集合下,指定的元素
7)zrem key min max :统计指定集合中分数在指定区间内的元素个数
8)zrank key value :返回该值在集合中的排名,排名从0开始
案例:给文章访问量排名