1、常见操作命令
- del key:删除给定key
- dump key:序列化给定key,返回被序列化的值
- exists key:检查key是否存在
- expire key second:为key设定过期时间,以秒计算,可省略second,默认为秒
- ttl key:返回key剩余时间,-1为永久,-2为失效
- persist key:移除key的过期时间,key将持久保存
- keys pattern:查询所有符号给定模式的key eg:keys *
- randomkey:随机返回一个key
- rename key newkey:修改key的名称
- move key db:移动key至指定数据库中 eg:move a 1
- type key:返回key所储存的值的类型
expire key second的使用场景:
1、限时的优惠活动
2、网站数据缓存
3、手机验证码
4、限制网站访客频率
key的命名建议:
- key不要太长,尽量不要超过1024字节。不仅消耗内存,也会降低查找的效率
- key不要太短,太短可读性会降低
- 在一个项目中,key最好使用统一的命名模式,如user:123:password
- key区分大小写
2、String(字符串)
string类型是二进制安全的,redis的string可以包含任何数据,如图像、序列化对象。一个键最多能存储512MB。二进制安全是指,在传输数据的时候,能保证二进制数据的信息安全,也就是不会被篡改、破译;如果被攻击,能够及时检测出来
常用命令:
- set key value:命令不区分大小写,但是key区分大小写
- get key:获取指定 key 的值。
- strlen key:返回key所存储的字符串的长度
- append key value:字符串拼接,追加至末尾,如不存在,为其赋值
- getrange key start end:获取key中字符串的子字符串,从start开始,end结束
- setrange key offset value:设置从offset往后的值
- MSET key value [key value ...]:同时设置一个或多个 key-value 对。
- mget key1 [key2 …]:获取多个key
- setnx key value:当key不存在时设置key的值。(SET if Not eXists),分布式锁的问题
- setex:创建一个key,并且设置过期时间
- getset key value:返回key的旧值,并设定key的值。当key不存在,返回nil
- INCR key :将 key 中储存的数字值增一。
- INCRBY KEY increment: 将 key 所储存的值加上给定的增量值(increment) 。
- DECR KEY:将 key 中储存的数字值减一。
- DECRBY KEY increment:key 所储存的值减去给定的减量值(decrement) 。
String应用场景:
1、String通常用于保存单个字符串或JSON字符串数据
2、因为String是二进制安全的,所以可以把保密要求高的图片文件内容作为字符串来存储
3、计数器:常规Key-Value缓存应用,如微博数、粉丝数。INCR本身就具有原子性特性,所以不会有线程安全问题
3、Hash(哈希)
Redis hash是一个string类型的field和value的映射表,hash特别适用于存储对象。每个hash可以存储232-1(40亿左右)键值对。可以看成KEY和VALUE的MAP容器。相比于JSON,hash占用很少的内存空间。
常用命令:
- hset key field value:为指定的key设定field和value
- hmset key field value[field1,value1]
- hsetnx:当不存在才创建该field
- hget key field:获取存储在哈希表中指定字段的值。
- hmget key field[field1]:获取所有给定字段的值
- hgetall key:返回hash表中所有字段和值
- hkeys key:获取hash表所有字段
- hvals key:获取hash表所有值
- hlen key:获取hash表中的字段数量
- hdel key field [field1]:删除一个或多个hash表的字段
- hexists:在key里面是否存在指定的field
- hincrby key field increment:增加某个field的值
应用场景:
Hash的应用场景,通常用来存储一个用户信息的对象数据。
- 相比于存储对象的string类型的json串,json串修改单个属性需要将整个值取出来。而hash不需要。
- 相比于多个key-value存储对象,hash节省了很多内存空间
- 如果hash的属性值被删除完,那么hash的key也会被redis删除
4、List(列表)
redis列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或尾部(右边)。底层实际是一个链表,类似于java中的linkedList。
常用命令:
- lpush key value1 [value2]:从左侧插入,右边的先出,相当于一个栈
- eg:lpush list 1 2 3 lrange list 0 -1 输出:3 2 1
- rpush key value1 [value2]: 从右侧插入,左边的先出
- eg:rpush list 1 2 3 lrange list 0 -1 输出:1 2 3
- lpushx key value:从左侧插入值,如果list不存在,则不操作
- rpushx key value:从右侧插入值,如果list不存在,则不操作
- llen key:获取列表长度
- lindex key index:获取指定索引的元素,从零开始
- lrange key start stop:获取列表指定范围的元素
- lpop key :从左侧移除第一个元素
- prop key:移除列表最后一个元素
- irem:删除指定个数的同一元素
- eg:irem list 2 3 删掉了集合中的两个三
- blpop key [key1] timeout:移除并获取列表第一个元素,如果列表没有元素会阻塞列表到等待超时或发现可弹出元素为止
- brpop key [key1] timeout:移除并获取列表最后一个元素,如果列表没有元素会阻塞列表到等待超时或发现可弹出元素为止
- ltrim key start stop :对列表进行修改,让列表只保留指定区间的元素,不在指定区间的元素就会被删除
- eg:list1中元素1 2 3 4 5 ltrim list1 2 3 list1剩余元素:3 4
- lset key index value :指定索引的值
- linsert key before|after world value:在列表元素前或则后插入元素
应用场景:
- 对数据大的集合数据删减
列表显示、关注列表、粉丝列表、留言评价…分页、热点新闻等- 任务队列
list通常用来实现一个消息队列,而且可以确保先后顺序,不必像MySQL那样通过order by来排序
补充:
- rpoplpush list1 list2 移除list1最后一个元素,并将该元素添加到list2并返回此元素
用此命令可以实现订单下单流程、用户系统登录注册短信等。
性能总结:
它是一个字符串链表,left、right都可以插入添加;
如果键不存在,创建新的链表;
如果键已存在,新增内容;
如果值全移除,对应的键也就消失了。
链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。
5、Set(集合)
redis的set是string类型的唯一且无序集合,是通过hashtable实现的。
- sadd key value1[value2]:向集合添加成员
- scard key:返回集合成员数
- smembers key:返回集合中所有成员
- sismember key member:判断memeber元素是否是集合key成员的成员
- srandmember key [count]:返回集合中一个或多个随机数
- srem key member1 [member2]:移除集合中一个或多个成员
- spop key:移除并返回集合中的一个随机元素
- smove source destination member:将member元素从source集合移动到destination集合
- sdiff key1 [key2]:返回给定的第一个集合和其他集合的差集(即在key1中的值而在其他key中找不到)
- sdiffstore destination key1[key2]:返回给定的第一个集合与其他的集合的差集并存储在destination中
eg:set1:1 2 3 set2:3 4 5 6 sdiffstore set3 set1 set2 smembers set3 result:1 2- sinter key1 [key2]:返回所有集合的交集
- sunion key1 [key2]:返回所有集合的并集
对两个集合间的数据[计算]进行交集、并集、差集运算
1、以非常方便的实现如共同关注、共同喜好、二度好友等功能。对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存储到一个新的集合中。
2、利用唯一性,可以统计访问网站的所有独立 IP
6、Zset(sorted set:有序集合)
redis zset 也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数却可以重复。
- zadd key score1 memeber1
- zcard key :获取集合中的元素数量
- zcount key min max 计算在有序集合中指定区间分数的成员数
- zcount key min max 计算在有序集合中指定区间分数的成员数
- zrange key start stop 指定输出索引范围内的成员
- zrangebyscore key min max 指定输出score区间内的成员
- zrank key member:返回有序集合指定成员的索引
- zrevrange key start stop :返回有序集中指定区间内的成员,通过索引,分数从高到底
- zrem key member [member …] 移除有序集合中的一个或多个成员
- zremrangebyrank key start stop 移除有序集合中给定的索引区间的所有成员(第一名是0)(低到高排序)
- zremrangebyscore key min max 移除有序集合中给定的分数区间的所有成员
常用于排行榜:
- 如推特可以以发表时间作为score来存储
- 存储成绩
- 还可以用zset来做带权重的队列,让重要的任务先执