Redis中最核心的两个命令set和get
两个最核心的命令就是get和set.
redis是按照键值对的方式来存储数据的,所以set就表示把key-value存储进去,get表示根据key来查询对应的value.
需要注意的是,必须进入redis客户端才能输入redis命令.
此处的key和value都是字符串类型.对于上述的key和value不需要加上引号就是表示字符串类型.如果要给key和value加上引号也是可以的,单引号和双引号都可以.
redis中的命令是不区分大小写的.
redis支持多种数据类型是针对value来说的.
redis自身的键值对是通过哈希表的方式来组织的.
get命令直接输入key就能得到value,如果key不存在,就会返回nil(就是null 的意思).
Redis的全局命令
redis是支持多种数据结构的.redis是键值对的结构,key固定就是字符串,而value会有多种数据类型,比如字符串,哈希表,列表,集合,有序集合等,操作不同的数据类型就会有不同的命令.
全局命令,就是能够搭配任意一个数据类型来使用的命令.
keys
用来查询当前服务器上匹配的key.
通过一些特殊字符(通配符)来描述key的墨阳,匹配上述模样的key就会被查询出来.
支持的通配符有?,*,[abcd],[^e].[a-c].
?表示匹配一个字符.
*表示匹配0个或者多个任意字符.
[abcd]表示只能匹配到a,b,c,d,别的不行,相当于给出固定的选项.
[^e]表示排除e,只有e匹配不了.
[a-c]表示匹配范围内的字符,包括两侧的边界.
flushall表示清空redis上所有的键值对.
keys命令的时间复杂度是O(N),所以在生产环境上一般会进制使用keys命令,尤其是keys *,keys *表示查询redis上所有的key,可能会造成redis服务器的阻塞.
exists
用来判定key是否存在,可以同时判定多个key.返回值是key存在的个数.
时间复杂度是O(1),因为redis组织键值对是通过哈希表的方式来组织的.
一次写多个key是比分开写写多次的效率要高的.
因为redis是一个客户端服务器结构的程序,客户端和服务器之间是要通过网络来进行通信的.
因为一次网络通信就要涉及一次封装和分用,多次的网络通信就要涉及多次的封装和分用.
redis自身已深知上述问题,所以redis的很多命令都支持一次操作多个key.
del
删除指定的key,可以一次删除一个也可以一次删除多个.
时间复杂度是O(1),返回值是删除掉的key的个数.
关于误删操作需要注意的是:如果redis作为缓存,此时误删几个数据问题是不大的,但是误删的太多了,就会导致大量的请求会直接发送给mysql,可能会导致mysql挂掉;如果redis作为数据库,此时误删数据的影响还是比较大的.
expire和ttl
给指定的key设置过期时间.设置的时间单位是秒.时间复杂度是O(1).此处设置过期时间,必须是针对已经存在的key进行设置.设置成功返回1,设置失败返回0.
key存活的时间超过这个指定的时间,就会被自动删除.
pexpire设置的过期时间单位是毫秒.
ttl用来查看当前key的过期时间还剩多少.单位是秒.
pttl也是查询过期时间但是单位是毫秒.
type
返回key对应value的数据类型.
Redis的key的过期策略是怎么实现的?
一个redis中可能同时存在很多很多的key,这些key中可能有很大一部分都带有过期时间,此时redis服务器是如何知道哪些key已过期要被删除,哪些key还没过期呢>
如果直接遍历所有的key,效率十分低,是行不通的.
redis的整体策略是定期删除和惰性删除.
定期删除:每隔一段时间抽取一部分key,进行过期时间的验证,但是要保证这个抽取检查的过程要足够快,所以抽取的key的个数也不能太多,因为要保证redis服务器的正常运行,防止被阻塞.
惰性删除:假设这个key已经到过期时间了,但是redis暂时还没有删除它,key还存在.紧接着,后面的有一次访问,正好使用到了这个key.于是此次访问就会让redis服务器触发删除key的操作,同时在返回一个nil.
虽然有了上述两种策略的结合,但是整体的效果还是一般,还是有很多残留的key没有被及时删除掉.
所以redis针对上述问题还提供了一系列的内存淘汰机制,比如LRU(Least Recently Used,最近最少使用),LFU(Least Frequently Used,最不经常使用)等.