命令 | 说明 |
---|---|
keys * | 查看当前库所有key (匹配:keys *1) |
exists [key] | 判断某个key是否存在 |
type [key] | 查看你的key是什么类型 |
del [key] | 删除指定的key数据 |
unlink [key] | 根据value选择非阻塞删除 (仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作) |
expire [key] [10] | 10秒钟:为给定的key设置过期时间 |
ttl [key] | 查看还有多少秒过期,-1表示永不过期,-2表示已过期 |
select | 切换数据库 |
dbsize | 查看当前数据库的key的数量 |
flushdb | 清空当前库 |
flushall | 通杀全部库 |
set
添加键值对
NX
:当数据库中key不存在时,可以将key-value添加数据库。
XX
:当数据库中key存在时,可以将ke y-value添加数据库,与NX参数互斥。
EX
:key的超时秒数。
PX
:key的超时毫秒数,与EX互斥。
get
: 查询对应键值。
append
: 将给定的
追加到原值的末尾。
strlen
: 获得值的长度。
setnx
: 只有在 key 不存在时 设置 key 的值。
incr
: 将 key 中储存的数字值增1,只能对数字值操作,如果为空,新增值为1。
decr
: 将 key 中储存的数字值减1,只能对数字值操作,如果为空,新增值为-1。
incrby / decrby
: 将 key 中储存的数字值增减。自定义步长。
mset
: 同时设置一个或多个 key-value对。
mget
: 同时获取一个或多个 value。
msetnx
: 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
getrange
: 获得值的范围,类似java中的substring
。
setrange
: 用
覆写
所储存的字符串值,从<起始位置>
开始(索引从0开始)。
setex
: 设置键值的同时,设置过期时间,单位秒。
getset
: 以新换旧,设置了新值同时获得旧值。
String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList
,采用预分配冗余空间的方式来减少内存的频繁分配.
内部为当前字符串实际分配的空间capacity
一般要高于实际字符串长度len
。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M。
lpush/rpush
: 从左边/右边插入一个或多个值(头插法和尾插法)。
lpop/rpop
: 从左边/右边吐出一个值。(类似于出栈操作)。
rpoplpush
: 从
列表右边吐出一个值,插到
列表左边。
lrange
: 按照索引下标获得元素(从左到右)。
lrange
: 0左边第一个,-1右边第一个,(0-1表示获取所有)。
lindex
: 按照索引下标获得元素(从左到右)。
llen
: 获得列表长度。
linsert
: 在
的前面插入
插入值。
lrem
: 从左边删除n个value
(从左到右)。
lset
: 将列表key下标为index的值替换成value。
List的数据结构为 快速链表quickList 。
首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是 ziplist,也即是 压缩列表 。将所有的元素紧挨着一起存储,分配的是一块连续的内存。
当数据量比较多的时候会改成 quicklist。
因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。
Redis 将链表和 ziplist 结合起来组成了 quicklist 。也就是将多个 ziplist 使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。
string
类型的无序集合。它底层其实是一个value
为null
的hash表,所以添加,删除,查找的 复杂度都是O(1) 。sadd .....
: 将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略smembers
: 取出该集合的所有值。sismember
: 判断集合
是否为含有该
值,有1,没有0scard
: 返回该集合的元素个数。srem .....
: 删除集合中的某个元素。spop
: 随机从该集合中取出一个值。srandmember
: 随机从该集合中取出n个值。不会从集合中删除 。smove
: 把集合中一个值从一个集合移动到另一个集合sinter
: 返回两个集合的交集元素。sunion
: 返回两个集合的并集元素。sdiff
: 返回两个集合的 差集 元素(key1中的,不包含key2中的)Map
hset
: 给
集合中的
键赋值
hget
: 从
集合
取出 valuehmset ...
: 批量设置hash的值hexists
: 查看哈希表 key 中,给定域 field 是否存在。hkeys
: 列出该hash集合的所有fieldhvals
: 列出该hash集合的所有valuehincrby
: 为哈希表 key 中的域 field 的值加上增量 1 -1hsetnx
: 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。
zadd …
: 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。zrange [WITHSCORES]
: 返回有序集 key 中,下标在
之间的元素带WITHSCORES
,可以让分数一起和值返回到结果集。zrangebyscore key min max [withscores] [limit offset count]
: 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。zrevrangebyscore key maxmin [withscores] [limit offset count]
: 同上,改为从大到小排列。zincrby
: 为元素的score加上增量。zrem
: 删除该集合下,指定值的元素。zcount
: 统计该集合,分数区间内的元素个数zrank
: 返回该值在集合中的排名,从0开始。SortedSet(zset)是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map
zset底层使用了两个数据结构:
有序集合在生活中比较常见,例如根据成绩对学生排名,根据得分对玩家排名等。对于有序集合的底层实现,可以用数组、平衡树、链表等。数组不便元素的插入、删除;平衡树或红黑树虽然效率高但结构复杂;链表查询需要遍历所有效率低。Redis采用的是跳跃表。跳跃表效率堪比红黑树,实现远比红黑树简单。
实例:
对比有序链表和跳跃表,从链表中查询出51
要查找值为51的元素,需要从第一个元素开始依次查找、比较才能找到。共需要6次比较。
总结:
跳跃链表在一些情况下效率要比普通的链表高。
Redis提供了Bitmaps这个“数据类型”可以实现对位的操作:
setbit
: 设置Bitmaps中某个偏移量的值(0或1)
getbit
:获取Bitmaps中某个偏移量的值
bitcount
: 统计字符串从start字节到end字节比特值为1的数量
bitop and(or/not/xor)
: bitop是一个复合操作, 它可以做多个Bitmaps的and(交集) 、or(并集) 、not(非) 、xor(异或) 操作并将结果保存在destkey中。
在工作当中,我们经常会遇到与统计相关的功能需求,比如统计网站PV(PageView页面访问量),可以使用Redis的incr、incrby轻松实现。
但像UV(UniqueVisitor,独立访客)、独立IP数、搜索记录数等需要去重和计数的问题如何解决?这种求集合中不重复元素个数的问题称为基数问题。
解决基数问题有很多种方案:
数据存储在MySQL表中,使用distinct count计算不重复个数
使用Redis提供的hash、set、bitmaps等数据结构来处理
以上的方案结果精确,但随着数据不断增加,导致占用空间越来越大,对于非常大的数据集是不切实际的。
能否能够降低一定的精度来平衡存储空间?Redis推出了HyperLogLog
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
什么是基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
pfadd < element> [element ...]
: 添加指定元素到 HyperLogLog 中pfcount [key ...]
: 计算HLL的近似基数,可以计算多个HLL,比如用HLL存储每天的UV,计算一周的UV可以使用7天的UV合并计算即可pfmerge [sourcekey ...]
: 将一个或多个HLL合并后的结果存储在另一个HLL中,比如每月活跃用户可以使用每天的活跃用户来合并计算可得Redis 3.2 中增加了对GEO类型的支持。GEO,Geographic,地理信息的缩写。该类型,就是元素的2维坐标,在地图上就是经纬度。redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度Hash等常见操作。
geoadd< longitude> [longitude latitude member...]
: 添加地理位置(经度,纬度,名称)geopos [member...]
: 获得指定地区的坐标值geodist [m|km|ft|mi ]
: 获取两个位置之间的直线距离georadius< longitude>radius m|km|ft|mi
: 以给定的经纬度为中心,找出某一半径内的元素