一、序言

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