Redis基本命令
Ping命令 心跳命令
set & get命令
set key value
get key
select命令
切换数据库
dbsize命令
flushdb命令
清除当前数据库数据
flushell命令
清除所有数据库数据
退出命令
quit、exit
关闭redis
redis-cli shutdown
shutdown
查看进程及端口号
#查看redis进程
pa axu | grep redis
#查看所有端口使用情况
netstat -ntulp |grep redis
Key命令
Redis中存储的数据整体是一个Map,其key为String类型,value可以是String、Hash、List、Set等类型。
格式:keys pattern
功能:查询所有符合条件的pattern的key,pattern为正则表达式。
Keys查询速度非常快,但在一个大的数据库中使用它可能会阻塞当前服务器的服务。生产环境中一般不使用,使用scan命令代替。
keys * 查询所有
keys h* 查询以h开头
查询是否存在EXISTS
删除DEL
重命名RENAME
MOVE移动到另一个数据库
将h20移动到3号库
TYPE查看类型
格式:TYPE key
返回key所存储的值的类型
类型:none(key不存在)、String(字符串)、list(列表)、set(集合)、zset(有序表)、hash(哈希表)
EXPIRE 与EXEPIRE设置生存时间
格式:EXPIRE key seconds
EXPIRE秒
PEXPIRE毫秒
TTL 和PTTL命令
TTL查看key的剩余生存时间
Key不存在时,返回-2。
Key存在但没设置剩余生存时间时,返回-1。
TTL秒
PTTL毫秒
PERSIST命令
格式:PERSIST key
将key的生存时间转换为持久的
转换成功返回1;
若key不存在或key没有设置生存时间,则返回0;
RANDOMKEY命令
格式:RANDOMKEY
从当前数据库中随机删除一个key。
删除成功返回 key
库为null时返回 nil
SCAN命令
scan命令代替keys
Value命令-String
Redis存储数据的Value可以是一个String类型数据。String类型的Value是Redis中最基本,最常见的类型。
String类型的Value可以存放任意类型数据。
String类型的Value最大是512M。
set
格式:SET key value
EX:设置过期时间,秒
PX:设置过期时间,毫秒
NX:指定的key不存在才会设置成功。等价于SETNX。
XX:指定的key必须存在,相当于更新value值。
setex
setex n1 300 hello 等同于set n1 hello ex 300
setnx
setnx name hello 等同于 set name hello NX
getset
mset
mset key1 value1 key2 value2 key3 value3
msetnx
mget
Append追加
incr 自增 和 decr自减
strlen
getrange
格式:getrange key start end
-1表示最后一位
setrange
格式:setrange key offset value
Hash型value操作命令
Redis存储数据的Value可以是一个Hash类型。Hash类型也称为Hash表、字典等。
Hash表就是一个映射表Map,也是由键-值对构成,为了与整体的key进行区分,这里的键称为field,值称为value。
Redis的Hash表中的file-value对均为String类型。
Hash类型Value非常四盒存储对象数据。Key为对象名称,value为描述对象属性的Map,对对象属性的修改在Redis中就可以直接完成,其不像String型Value存储对象,那个对象是序列化过的,如序列化为JSON串,对对象属性值的修改需要先反序列化为对象后再修改,修改后再序列化为JSON串写入到Redis。
hset和hmset
格式:hset names name1 zhangsan name2 baoguo
hmset等价于hset
hsetnx
nx:指定的key不存在才会设置成功。等价于SETNX。
hget和hmget
hgetall 、 hkeys 、 hlen 、hvals
hdel
删除file
hexists
查看是否存在
hincrby
增加
hstrlen
查看field的长度
List型Value操作命令
Redis存储数据的 Value可以是一个 String列表类型数据,即该列表中的每个元素均为ting类型数据,列表中的数据会按照插入顺序进行排序,不过,该列表的底层实际是一个无头节点的双向链表,所以对列表表头与表尾的操作性能较高,但对中问元素的插入与删除的操作的性能相对较差。
lpush 和 rpush
lrange 和lindex
lrange 元素 开始下标 结束下标 、结束下标:-1表示最后 格式:lrange key start stop
格式:lindex key index
lset 和 rpushx
格式:lset key index element
格式:rpush key element [element ...]
rpushx的x表示必须存在
linsert和lpop rpop
格式:linsert key BEFORE|AFTER pivot element
格式:lpop key [count]
rpoplpush
格式:rpoplpush source destination
Lrem
格式:lrem key count element
Ltrim
格式:ltrim key start stop
保留指定区域
lpush + rpop可以实现队列数据结构效应,先进先出。通过lpush从左侧插入数据,通过rpop右侧取出数据。或rpush+lpop
lpush + brpop可以实现阻塞式消息队列效果。
lpush+lpop可以实现栈数据结构,先进后出。或rpush+rpop
Set型value操作命令
set集合中的元素具有无序性与不可重复性。
应用场景:1、动态黑白名单 2、有限随机数 3、用户画像
sadd 和smembers
格式:sadd key member [member ...
格式:smembers key
sismember
格式:sismember key member
smove
格式:smove source destination member
srem
格式:srem key member [member ...]
srandmember
srandmember key [count]
随机获取
spop
sdiff差集
将相同的元素去掉
格式:sdiff key [key ...]
sdiffstore
格式:sdiffstore destination key [key ...]
将c和cat的差集结果存入result
sinter 和 sinterstore
sinter key [key ...]
sinterstore destination key [key ...]
Sunion 和 sunionstore
sunion key [key ...]
sunionstore destination key [key ...]
有限ZSet型Value操作命令
Redis存储数据的vaue可以是一个有序Set,这个有序set中的每个元素均 String类型。有序set与set的不同之处是,有序Set中的每一个元素都有一个分值 score, Redis会根据score的值对集合进行由小到大的排序。其与set集合要求相同,元素不能重复,但元素的score可以重复。由于该类型的所有命令均是字母z开头,所以该Set也称为Zset
zadd
格式:zadd key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
zrange和zrevrange
格式:zrange key start stop
格式:zrevrange key start stop
zrangebyscore
格式:zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
zcount 和zcard
格式:zcount key min max
格式:zcard key
zscore和zrank
格式:zscore key member
格式:zrank key member
zincrby
格式:zincrby key increment member
Zrem和 zremrangebyrank
移除
格式:zrem key member [member ...]
格式:zremrangebyrank key start stop
格式:zremrangebyscore key min max
zrangebylex
zrangebylex适用于集合中所有成员具有相同分值的情况。
格式:zrangebylex key min max [LIMIT offset count]
benchmark测试工具
Redis自带一个benchmark测试工具,用来测试redis的性能,是一个压力测试工具。
redis-server redis.conf
redis-benchmark -h 127.0.0.1 -p 6369 -c 50 -n 10000 -a password
或 redis-benchmark -c 50 -n 10000 -a password
简单动态字符串SDS
Redis的Key和 Value,其基础数据类型都是字符串。例如,Hash型 Value的field与 value的类型、List型、Set型、ZSet型 Value的元素的类型等都是字符串。虽然Redi是使用标准C语言开发的,并没有直接使用C语言中传统的字符串表示,而是自定义了种字符串。这种字符串本身的结构比较简单,但功能却非常强大,称为简单动态字符串Simple Dynamic String,简称SDS。
SDS结构
SDS不同于字符串。C字符串本身是一个双引号括起来的,以’\0’结尾的字符序列。
SDS是一个结构体,定义在Redis安装目录下的src/sds.h中。
Redis中的字符串并不都是SDS,也会是C字符串。C字符串只会出现在字符串“字面常量”中,并且该字符串不可能发生变更。
struct sdshdr{
//字节数组,用于保存字符串
char buf[];
//buf[]中已使用字节数量,称为SDS
int len;
//buf[]中尚未使用的字节数量
int free;
}
常用SDS操作函数
sdsnew() 使用指定的C字符串创建一个SDS
sdsempty() 创建一个不包含任何字符串数据的SDS
sdsdup() 创建一个SDS副本
sdsfree() 释放指定的DS
sdsclear() 清空指定SDS的字符串内容
sdslen() 获取指定SDS的已使用空间len值
sdsavail() 获取指定SDS的未使用空间free值
sdsMakeRoomFor() 使指定SDS的free空间增加指定的大小
sdsRemoveFreeSpace() 释放指定SDS的free空间
sdscat() 将指定的C字符串拼接到指定SDS字符串末尾
sdscatsds() 将指定的SDS字符串拼接到指定SDS字符串末尾
sdscpy() 将指定的C字符串拼接到指定SDS中并覆盖原字符串内容
sdsgrouzero() 扩展SDS字符串到指定长度。此扩展是使用空字符’\0’填空
sdsrange() 截取指定范围内的SDS字符串
sdstrim() 在指定SDS中删除所有指定C字符串中出现的所有字符
sdsemp() 对比两个给定的SDS字符串是否相同
sdstolow() 将指定SDS字符串中的所有字母变小写
sdstoupper() 将指定SDS字符串中的所有字母变大写
SDS的优势
C字符串使用Len+1长度的字符数组来表示实际长度为Len的字符串,字符数组最后以空字符\0结尾,表示字符串结束。这种结构简单,但不能满足 Redis对字符串功能性、安全性及高效性等的要求。
防止”字符串长度获取”性能瓶颈
对于C字符串,若要获取其长度,则必须要通过遍历整个字符串才可获取到的。对于超长字符串的遍历,会成为系统的性能瓶颈但,由于sDs结构体中直接就存放着字符串的长度数据,所以对于获取字符串长度需要消耗的系统性能,与字符串本身长度是无关的,不会成为 Redis的性能瓶颈。
保证二进制安全
C字符串中只能包含符合某种编码格式的字符,例如 ASCII UTF-8等,并且除了字符串末尾外,其它位置是不能包含空字符0的,否则该字符串就会被程序误解为提前结束。而在图片、音频、视频、压缩文件、 office文件等二进制数据中以空字符\o作为分隔符的情况是很常见的。故而在C字符串中是不能保存像图片、音频、视频、压缩文件、 office文件等进制数据的。
但SDS不是以空字符"0作为字符串结束标志的,其是通过len属性来判断字符串是否结束的。所以,对于程序处理SDS中的字符串数据,无需对数据做任何限制、过滤、假设只需读取即可。数据写入的是什么,读到的就是什么。
减少内存再分配次数
SDS采用了空间预分配策略与空间预分配策略是指,每次SDS进行空间扩展时,程序不但为其分配所需的空间,还会为其分配额外的未使用空间,以减少内存再分配次数。而额外分配的未使用空间大小取决于空间扩展后SDS的len属性值。
如果len属性值小于1M,那么分配的未使用空间free的大小与len属性值相同
如果len属性值大于等于1M,那么分配的未使用空间free的大小固定是1M
SDS对于空间释放采用的是惰性空间释放策略。该策略是指,SDS字符串长度如果缩短,那么多出的未使用空间将暂时不释放,而是增加到free中。以使后期扩展SDS时减少内存再分配次数。
如果要释放SDs的未使用空间,则可通过 sdsRemovefreeSpace0函数来释放。
兼容C函数
Redis中提供了很多的SDS的API,以便用户对Redis进行二次开发。为了能够兼容C函数,SDS的底层组buf[]中的字符串仍以字符串’\0’结尾。
zipList
zipList,通常称为压缩列表,是一个经过特殊编码的用于存储字符串或整数的双向链表。
其底层数据结构由三部分构造:head、entries、与end。这三部分在内存上是连续存放的。
Head
zlbytes:占4个字节,用于存放ziplist列表整体数据结构所占的字节数,包括bytes本身的长度。
zltail:占4个字节,用于存放ziplist中最后一个 entry在整个数据结构中的偏移量(字节)。该数据的存在可以快速定位列表的尾 entry位置,以方便操作
zllen:占2字节,用于存放列表包含的 entry个数。由于其只有16位,所以 ziplist最多可以含有的 entry个数为215-1=6535个
entries
entries是真正的列表,由很多的列表元素 entry构成。由于不同的元素类型、数值的不同,从而导致每个 entry的长度不同。
每个enty由三部分构成
prevlength:该部分用于记录上一个 entry的长度,以实现逆序遍历默认长度为1字节,只要上一个 entry的长度<254字节, prevlength就占1字节,否则其会自动扩展为3字节长度。encoding:该部分用于标志后面的data的具体类型。如果data为整数类型, encoding固定长度为1字节。如果data为字符串类型,则 encoding长度可能会是1字节、2字节或5字节。data字符串不同的长度,对应着不同的 encoding长度。
data:真正存储的数据。数据类型只能是整数类型或字符串类型。不同的数据占用的字节长度不同。
end
end只包含一部分,称为zlend,占1字节,值固定为255,即二进制位全为1,表示zipList列表的结束。
listPack
对于Ziplist,实现复杂,为了逆序遍历,每个 entry中包含前一个 entry的长度,这样会导致在 ziplist中间修改或者插入enty时需要进行级联更新。在高并发的写操作场景下会极度降低 Redis的性能。为了实现更紧凑、更快的解析,更简单的实现,重写实现了 ziplist,并命名为 listpack
在 Redis7.0中,已经将 ziplist全部替換为了 listpack,但为了兼容性,在配置中也保留ziplist的相关属性。
listPack也是一个经过特殊编码的用于存储字符串或整数的双向链表。其底层数据结构部分构成:head、 entries与end,且这三部分在内存上也是连续存放的tpack与 Ziplist的重大区别在head与每个 entry的结构上,表示列表结束的end与 ziplist的end是相同的,占一个字节
head
head由两部分构成:
totalbytes:占4个字节,用于存放 list Pack列表整体数据结构所占的字节数,包括totalbytes本身的长度
elemNum:占2字节,用于存放列表包含的entry个数。其意义与 ziplist中len的相同与 Ziplist的head相比,没有了记录最后一个 entry偏移量的 entail
entries
entries也是 list Pack中真正的列表,由很多的列表元素 entry构成。由于不同的元素类型、数值的不同,从而导致每个entry的长度不同。但与ziplist的entry结构相比, listPack的enty结构发生了较大变化。其中最大的变化就是没有了记录前一个enty长度的 prevlength,而增加了记录当前
entry长度的 element-totak-len。而这个改变仍然可以实现逆序遍历,但却避免了由于在列表中间修改或插入enty时引发的级联更新
每个enty仍由三部分构成
encoding:该部分用于标志后面的data的具体类型。如果data为整数类型, encoding长度可能会是1、2、3、4、5或9字节。不同的字节长度,其标识位不同。如果dat为字符串类型,则 encoding长度可能会是1、2或5字节。data字符串不同的长度,对应着不同的 encoding长度
data:真正存储的数据。数据类型只能是整数类型或字符串类型。不同的数据占用的字节长度不同
element-tota-len:该部分用于记录当前 entry的长度,用于实现逆序遍历。由于其特殊的记录方式,使其本身占有的字节数据可能会是1、2或5字
skipList
skiplist,跳跃列表,简称跳表,是一种随机化的数据结构,基于并联的链表,宏现简单,査找效率较高。简单来说跳表也是链表的一种,只不过它在链表的基础上增加了跳跃功能也正是这个跳跃功能,使得在査找元素时,能够提供较高的效率。
quickList
quicklist,快速列表, quicklist本身是一个双向无循环链表,它的每一个节点都是一个ilit从Reds3.2版本开始,对于Lt的底层实现,使用 quicklist替代了pLit和iketziplist与 lin kedlist都存在有明显不足,而 quicklist则对它们进行了改进:吸取了 ziplist和 linkedlist的优点,避开了它们的不足quicklist本质上是 ziplist和 linkedlist的混合体。其将 linkedlist按段切分,每一段使用ziplist来紧凑存储若干真正的数据元素,多个 ziplist之间使用双向指针串接起来。当然对于每个 ziplist中最多可存放多大容量的数据元素,在配置文件中通过 list-max- ziplist-size属性可以指定。
BitMap操作命令
Bitmap是 Redis2.2.0版本中引入的一种新的数据类型。该数据类型本质上就是一个仅包含0和1的二进制字符串。而其所有相关命令都是对这个字符串二进制位的操作。用于描述该字符串的属性有三个:key、 offset、 bitvalue。
key: Bitmap是 Redis的 key-value中的一种vaue的数据类型,所以该vaue一定有其对应的key。
offset:每个BitMap数据都是一个字符串,字符串中的每个字符都有其对应的索引,该索引从0开始计数。该索引就称为每个字符在该 Bitmap中的偏移量 offset。这个 offset的值的范围是[0,232-1],即该 offset的最大值为4G1,即4294967295,42亿多。
bitvalue:每个 Bitmap数据中都是一个仅包含0和1的二进制字符串,每个 offset位上的字符就称为该位的值 bitvalue。 bitvalue的值非0即1
setbit 和getbit
格式:setbit key offset value
格式:getbit key offset
bitcount
格式:bitcount key [start end [BYTE|BIT]]
bitpos
格式:bitpos key bit [start [end [BYTE|BIT]]]
bitop
格式:bitop operation destkey key [key ...]
and 并运算 dest 并运算的结果存储在dest里面
HyperLogLog操作命令
超级日志记录该数据类型可以简单理解为ー个set集合,集合元素为字符串。但实际Hyperloglog是一种基数计数概率算法,通过该算法可以利用极小的内存完成独立总数的统计。其所有相关命令都是对这个“set集合”的操作Hyperloglog算法是由法国人 Philippe Flajolet博士研究出来的, Redis的作者 Antirez为了纪念 Philippe Flajolet博士对组合数学和基数计算算法分析的研究,在设计 Hyperloglog命令的时候使用了Philippe Flajole姓名的英文首字母PF作为前缀。
HyperLogLog应用场景
HyperLogLog可对数据量超级庞大的日志数据做到不精确的去重计数统计。误差是0.81%。UV数据适合使用HyperLogLog进行记录。
pfadd
格式:pfadd key [element [element ...]]
pfcount
格式:pfcount key [key ...]
pfmerge
格式:pfmerge destkey sourcekey [sourcekey ...]
将city、database集合合并到sum
Geospatial操作命令
Geospatial,地理空间。
Redis在3.2版本中引入了Geospatial这种新的数据类型。该类型本质上仍是一种集合只不过集合元素比较特殊,是一种由三部分构成的数据结构,这种数据结构称为空间元素
经度: longitude。有效经度为[-180,180]。正的表示东经,负的表示西经。
伟度: latitude。有效纬度为185.05112878,85.05112878]。正的表示北纬,负的表示南位置名称:为该经纬度所标注的位置所命名的名称,也称为该 Geospatial集合的空间元素名称。通过该类型可以设置、查询某地理位置的经纬度,査询某范围内的空间元素,计算两空间元素间的距离等。
应用场景:QQ动态中的“附件”功能,钉钉定位签到等,微信“发现”功能
geoadd
格式:geoadd key [NX|XX] [CH] longitude latitude member [longitude latitud
geodist
格式:geodist key member1 member2 [M|KM|FT英尺|MI英里]
默认值为M米
geopos
格式:geopos key member [member ...]
geohash
格式:geohash key member [member ...]
geohash是一种地址编码方法。把二维的空间维度数据编码成一个字符串。该值主要用于底层应用功或调试,实际中的用处不大。
georadius
格式:georadius key longitude latitude radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count
查看范围内
发布订阅操作命令
subscribe
格式:subscribe channel [channel ...]
功能: Redis客户端通过一个 subscribe命令可以同时订阅任意数量的频道。在输出了订阅了主题后,命令处于阻塞状态,等待相关频道的消息。
psubscribe
格式:psubscribe pattern [pattern ...]
功能:订阅一个或多个符合给定模式的频道。说明:这里的模式只能使用通配符*。例如,诜*可以匹配所有以ⅱ开头的频道,像 it news、it blog、 it tweets等;news.*可以匹配所有以news开头的频道,像news. global. today
publish
格式:publish channel message
unsubscribe
取消订阅
格式:unsubscribe [channel [channel ...]]
punsubscribe
格式:punsubscribe [pattern [pattern ...]]
功能:退订一个或多个符合给定模式的频道
这里的模式只能使用通配符*。如果没有频道被指定,其效果与 SUBSCRIBE命令相同,客户端将退讧所有订阅的频道
pubsub
PUBSUB是一个查看订阅与发布系统状态的内省命令集,它由数个不同格式的子命令组成,下面分别介绍这些子命令的用法。
pubsub channels
格式:pubsub channels [pattern]
列出当前所有的活跃频道。活跃频道指的是那些至少有一个订阅者的频道。说明: pattern参数是可选的。如果不给出 pattern参数,将会列出订阅/发布系统中的所有活跃频道。如果给出 pattern参数,那么只列出和给定模式 pattern相匹配的那些活跃频道。 pattern中只能使用通配符*。
pubsub numsub
格式:pubsub numsub [channel [channel ...]]
返回给定频道的订阅者数量