一、序言
Redis是一个基于内存亦可持久化的日志型数据结构存储,基于RESP协议进行通讯,可用于数据库、缓存和消息队列。协议简单,数据在内存中进行操作同时又是单线程运行,避免了资源竞争以及线程之间上下文切换的开销,因此Redis的速度很快。但同时也存在一个请求独大的问题,如果某个命令处理很慢,会导致其他命令一直处于阻塞状态。
二、RESP协议
Redis是使用RESP协议进行通讯,底层其实也是TCP协议,RESP协议的数据形式很简单,*后面数量表示存在几个$,$后面数量表示字符串的长度,例如:
*3
$3
SET
$5
key
$7
value
合并之后的数据便是:"*3\r\n$3\r\nSET\r\n$5\r\nkey\r\n$7\r\nvalue\r\n",Redis中回复也是使用这种格式。
Redis中提供了5中基本数据类型方便数据的操作,分别是:string、list、hash、set、zset。
三、字符串(String)
在Java中,万物皆对象,也皆可变成string,包括XML,JSON,数字,二进制文件(图片 音频、视频),最大不能超过512MB。
--设置值
set key value ex 10 //设置kv,10秒后过期
setnx key value //key不存在,设置value成功返回1,存在则添加失败返回0
mset key value key2 value2... //批量设置值
append key value //字符串追加
--获取值
get key //存在则返回value, 不存在返回nil
mget key key2 key3... //批量获取值
strlen key //获取字符串长度
getrange key 2 4 //截取字符串
--计数
incr key //value+1,非整数返回错误,key不存在设置value为1,返回1
decr key //value-1
incrby key n //value+n
decrby key n //value-n
incrbyfloat key 1.1 //浮点型key+1.1
四、Hash
hash可以看成是一个映射表类型的存储结构,有点类似于Java中的Map<K,Object>这种结构,适合存储对象。
hset key field value //设值,成功返回1,失败返回0
hget key field //取值,返回field对应的值
hdel key field //删除值,返回删除的个数
--计算field个数
hset key field value; hset key field2 value2;
hlen key //返回2,key中有两个属性值
--批量设值
hmset key field value field2 value2 field3 value3 ...
--批量取值
hmget key field field2 field3
hexists key field //判断field是否存在,若存在返回1,不存在返回0
hkeys key //获取所有field
hvals key //获取所有value:
hgetall key //获取所有field与value:
hincrby key field 1 //增加
hincrbyfloat key field 2 //浮点型增加
五、List
list可用来存储多个有序的字符串,一个列表最多可存2的32次方减1个元素,可以看成是一个消息队列。因为有序,可以通过索引下标获取元素或某个范围内元素列表,列表元素可以重复。
--添加命令:
rpush key c b a //从右向左插入cba, 返回值3
lrange key 0 -1 //从左到右获取列表所有元素 返回 c b a
lpush key c b a //从左向右插入cba
linsert key before b c //在b之前插入c, after为之后
--查找命令:
lrange key start end //索引下标特点:从左到右为0到N-1
lindex james -1 //返回最右末尾值,-2返回倒数1第二个
llen key //返回当前列表长度
lpop key //把最左边的第一个元素c删除
rpop key //把最右边的元素a删除
六、Set
set保存多元素,与列表不同的是不允许有重复元素,且集合是无序,一个集合最多可添加231-1个元素,除了支持增删改查,还支持集合交集、并集、差集;
sadd key a b c //向key中插入3个元素,返回3
sadd key a b //若再加入相同的元素,则重复无效,返回0
smember key //获取key的所有元素,返回结果无序
srem key a //返回1,删除a元素
scard key //返回2,计算元素个数
sinter key1 key2 //计算集合的交集,可用于智能推荐
七、ZSet
zset常用于排行榜,如视频网站需要对用户上传视频做排行榜,或点赞数。与集合有联系,不能有重复的成员,有序,根据score排序。
zadd key score member //基本命令
zadd key 200 member //返回操作成功的条数1
zadd key 200 member 120 member2 100 member3 ... // 批量添加,操作成功返回操作总条数3
zadd key nx 100 member //键key必须不存在,主用于添加
zadd key xx incr 200 member //键key必须存在,主用于修改,此时为300
zadd key xx ch incr -n member //减少分数,返回操作结果
zrange key 0 -1 withscores //查看分数与成员
zcard key //计算成员个数
zrank key member //返回名次,下表从0开始
zrevrank key member //反排序,score越高,排名越前
八、Redis全局命令
适用于所有数据类型的指令
keys * //查看所有键
dbsize //查看键总数,如果存在大量键,禁止使用此指令
exists key //检查键是否存在,存在返回1,不存在返回0
del key //删除键, 返回删除键个数,删除不存在键返回0
expire key seconds //设置键过期时间
ttl key //查看剩余的过期时间
type key //查询键的数据结构类型,不存在返回none