Redis学习笔记(二)
2019-12-22 本文已影响0人
dev_winner
redis 常用命令
-
del key
:删除key。 -
dump key
:序列化一个key,返回被序列化的值。 -
exists key
:检查key是否存在。 -
expire key seconds
:设置key的过期时间(以秒
计)。 -
pexpire key milliseconds
:设置key的过期时间(以毫秒
计)。 -
ttl key
:以秒
为单位,返回给定key的剩余生存时间(TTL:time to live) (返回值:-1
:永久;-2
:该key不存在;其他非负整数
:该key的剩余生存时间)。 -
pttl key
:以毫秒
为单位,返回给定key的剩余生存时间。 -
persist key
:移除key的过期时间,key将永久保存。 -
keys pattern
:查找所有符合给定模式(pattern)的key。 通配符(pattern):*
代表所有;?
表示代表一个字符。 -
randomkey
:随机返回一个key。 -
rename key newkey
:修改key的名称。 -
move key db
:移动key至指定数据库中。 -
select db
:切换到某个数据库,db为数字,取值为0~15
。 -
type key
:返回key对应的值的数据类型。
设置key过期时间的应用场景
1、限时的优惠活动信息;
2、网站数据缓存(对于一些需要定时更新的数据,例如:积分排行榜);
3、手机验证码;
4、限制网站访客访问频率(例如:1分钟最多访问10次)。
key的命名建议
1、key不要太长,尽量不要超过
1024字节
。因为这不仅消耗内存,也会降低查找的效率;
2、key不要太短,太短可读性会降低;
3、在一个项目中,key最好使用统一的命名模式,间隔用冒号隔开
,如user:123:password;
4、key的名称区分大小写
。
redis数据类型
字符串-string
- string是redis最基本的,且是二进制安全的数据类型。一个key对应一个value。一个key最大能存储512MB。string可以包含任何数据,比如jpg图片或者序列化的对象 。
-
二进制安全
:指在传输数据时,保证二进制数据的信息安全,即不被篡改、破译等,若被攻击,则能够及时地检测出来。 特点:编码、解码发生在客户端完成,执行效率高;不需要频繁地编解码,不会出现乱码问题。 -
set key value
:命令不区分大小写,但是key区分大小写。 -
setnx key value
:当key不存在时设置key的值。(set if not exists)(解决分布式锁
的方案之一)。 -
mset key value [key value ...]
:同时设置一个或多个键值对。 -
get key
:获取指定key的值。若key不存在,则返回nil
。若key储存的值不是字符串类型,则返回一个错误。 -
getrange key start end
:获取指定key对应的值的子字符串,左闭右闭区间。若key不存在,则返回空字符串""
。 -
mget key1 [key2 ...]
:获取所有给定key的值。 -
getset key value
:设定key的值,并返回key的旧值。当key不存在,返回nil。 -
strlen key
:返回key对应的值的字符串长度。 -
incr key
:将key对应的值+1。若不存在key,则key中的值话先被初始化为0再加1。若key对应的值不是数字类型,则将报错:(error) ERR value is not an integer or out of range
-
incrby key x
:将key对应的值+x。(注意:key对应的值必须是数字类型) -
decr key
:将key对应的值-1。(注意:key对应的值必须是数字类型) -
decrby key x
:将key对应的值-x。(注意:key对应的值必须是数字类型) -
append key value
:将字符串value追加至key对应的值的末尾,若key不存在,则设置一个新的键值对。
string类型的应用场景
1、string通常用于保存单个字符串或JSON字符串数据;
2、因为string是二进制安全的,所以完全可以把一个图片文件的内容作为字符串来保存;
3、计数器(常规K-V的缓存应用。常规计数:微博数,粉丝数)
哈希-hash
- redis hash是一个string类型的field和value的映射表。hash特别适用于
存储对象
。每个hash可以存储 个键值对,可将其看成一个map容器。相比于JSON,hash占用很少的内存空间。 -
hset key field value
:为指定的key,设定field-value。 -
hmset key field1 value1 [field2 value2 ...]
:将多个field-value(域-值)对设置到key的哈希值当中。 -
hget key field
:获取key的哈希值中某个field域对应的值。 -
hmget key field1 [field2 ...]
:获取key的哈希值中所有给定field域对应的值。 -
hgetall key
:返回key的哈希值中所有field域和value值。 -
hkeys key
:获取key的哈希值中所有field域的名称。 -
hlen key
:获取key的哈希值中field域的个数。 -
hdel key field1 [field2 ...]
:删除key的哈希值中所有给定的field-value(域-值)对。 -
hsetnx key field value
:只有key的哈希值中field域不存在时,才添加key的哈希值中一对field-value。 -
hincrby key field increment
:将key的哈希值中指定field对应的整数值加上增量increment。 -
hincrbyfloat key field increment
:将key的哈希值中指定field对应的浮点数值加上增量increment。 -
hexists key field
:查看key的哈希值中是否存在某个field域。
hash类型的应用场景
存储一个用户信息对象的数据
列表-list
- 类似java集合中的双向循环链表
LinkedList
。 -
lpush key value1 [value2 ...]
:将一个或多个值依次插入到列表key的左侧。 -
rpush key value1 [value2 ...]
:将一个或多个值依次插入到列表key的右侧。 -
lpushx key value1 [value2 ...]
:将一个或多个值插入到已存在的列表左侧。若列表key不存在,则操作无效。 -
rpushx key value1 [value2 ...]
:将一个或多个值插入到已存在的列表右侧。若列表key不存在,则操作无效。 -
llen key
:获取列表key的长度。 -
lindex key index
:获取列表key中指定索引的元素。 -
lrange key start stop
:获取列表中指定范围的元素,左闭右闭区间。其中,0表示列表中第一个元素,1表示列表中第二个元素,以此类推。也可以使用负数下标,-1 表示列表中最后一个元素,-2表示列表中倒数第二个元素,以此类推。 -
lpop key
:移除并返回列表左侧的第一个元素。 -
prop key
:移除并返回列表右侧的第一个元素。 -
blpop key1 [key2 ...] timeout
:移除并返回列表中第一个元素,若列表中没有元素,则会阻塞列表到等待超时或发现可弹出元素为止。 -
brpop key1 [key2 ...] timeout
:移除并返回列表中最后一个元素,若列表中没有元素,则会阻塞列表到等待超时或发现可弹出元素为止。 -
ltrim key start stop
:对列表进行修剪(trim),让列表只保留指定区间的元素,不在指定区间的元素就会被删除。 -
lset key index value
:修改列表中指定索引的值。 -
linsert key before|after pivot value
:在列表key中某个元素pivot的前面或后面插入一个元素。 -
rpoplpush list1 list2
:移除列表list1中最后一个元素,将该元素添加到列表list2的左侧并返回此元素。
list类型的应用场景
1、对数据量大的集合进行数据删减、列表显示、留言评价、分页、热点新闻(Top5)等;利用
lrange
还可以很方便地实现分页功能。
2、任务队列:list列表通常用来实现一个消息队列,其可以确保任务被执行的先后顺序,不必像MySQL那样通过order by
关键字来排序。常用案例:订单系统的下单流程、用户系统登录注册功能等。
无序不重复集合-set
-
sadd key value1[value2 ...]
:向集合中添加一个或多个元素。 -
scard key
:返回集合中元素的个数。 -
smembers key
:返回集合中所有元素。 -
sismember key member
:判断集合key中是否包含一个member元素。 -
srandmember key [count]
:返回集合key中一个或多个随机元素。 -
srem key member1 [member2 ...]
:移除集合key中一个或多个元素。 -
spop key [count]
:随机移除并返回集合key中的一个或多个元素。 -
smove source destination member
:将指定的member元素从source集合移动到destination集合。 -
sdiff key1 [key2 ...]
:返回第一个集合key1与其他集合的差集。 -
sinter key1 [key2 ...]
:返回给定集合的交集。 -
sunion key1 [key2 ...]
:返回所有给定集合的并集。 -
sdiffstore destination key1 [key2 ...]
:将第一个集合key1与其他集合的差集元素存储在destination集合中。 -
sinterstore destination key1 [key2 ...]
:将给定集合的交集元素存储在destination集合中。 -
sunionstore destination key1 [key2 ...]
:将给定集合的并集元素存储在destination集合中。
set类型的应用场景
1、对两个集合间的数据进行交集、并集、差集运算,可以实现如共同关注、共同喜好、二度好友等功能。
2、利用唯一性,可以统计访问网站的所有独立 IP地址。
有序不重复集合-zset(Sorted Set)
- 有序集合和无序集合是string类型元素的集合,集合中不允许有重复的元素。
- 每个元素都会关联一个double类型的分数,集合中的元素通过分数从小到大进行排序。有序集合中不能有重复的元素,但可以有重复的分数(score)!
- 因为有序集合是通过
哈希表
实现的,所以添加,删除,查找的时间复杂度都是。 集合中允许存放的元素个数最大为 。 -
zadd key score1 memeber1 [score2 memeber2 ...]
:向有序集合key中添加一个或多个元素,或更新已存在元素的分数。 -
zcard key
:获取有序集合中元素的个数。 -
zrange key start stop [withscores]
: 返回有序集合中指定区间内的元素,左闭右闭区间,分数默认从低到高排序。 -
zrevrange key start stop [withscores]
:返回有序集合中指定区间内的元素,左闭右闭区间,分数默认从高到低排序。 -
zcount key min max
: 返回有序集合中指定区间分数的元素个数。 -
zrank key member
:返回有序集合中指定成元素的索引。 -
zrem key member1 [member2 ...]
:移除有序集合中一个或多个元素。 -
zremrangebyrank key start stop
:移除有序集合中指定索引区间的所有元素,分数默认从低到高排序。 -
zremrangebyscore key min max
:移除有序集合中指定分数区间的所有元素,分数默认从低到高排序。
zset类型的应用场景
1、典型的实例:
排行榜
;如twitter的public timeline可以将发表时间作为score来存储,这样获取数据时就是自动按时间排好序的。
2、存储学生考试成绩;
3、可以用做带权重的任务队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务,让重要的任务先执行。