目录
Redis简介:
一些学习的网址:
菜鸟教程:http://www.runoob.com/redis/redis-hashes.html
Redis命令参考文档:http://redisdoc.com/
《Redis开发与运维》 链接:https://pan.baidu.com/s/1gX_P9OxAIH6VgS7J6p9_5g 提取码:af1a
全局命令:
查看所有键值:keys *
这个命令会遍历所有键,时间复杂度为O(n),Redis保存大量键是,线上环境禁止使用。
键总数:dbsize
不会遍历所有键,而是直接获取Redis内置的键总数变量,时间复杂度为O(1)
检查键是否存在:exists key
如果存在返回1,不存在返回0。
删除键:del key [key ...]
返回值为删除键的个数
键过期:expire key seconds
Redis支持对键添加过期时间,当超过过期时间后,会自动删除键。
expire hello 10 (给hello这个键设置10秒的过期时间)
用于查看剩余过期时间:ttl key
用于查看剩余过期时间,有三种返回值:
大于等于0的整数:键剩余过期时间
-1:键没有设置过期时间
-2:键不存在
键的数据结构类型:type key
数据结构和内部编码
redis有五种数据结构
一、字符串(String)
所有键都是字符串类型
字符串类型的值实际可以是字符串(简单字符串、复杂的字符串(JSON、XML)、数字(整型、浮点数),二进制(图片、音频、视频),最大不能超过512MB。
常用命令:
set key value
get key
批量设置值:mset key [key ...]
批量获取值:mget key [key ...]
计数:incr key
用于对值做自增操作,返回结果为:
- 值不是整数,返回错误;
- 值是整数,返回自增后的结果;
- 键不存在,按照值为0自增,返回结果为1;
自增自减:
incrby(自增指定数字):
incrby key increment
decrby(自减指定数字)
decrby key decrement
incrbyfloat(自增浮点数)
incrbyfloat key increment
不常用命令:
append key value 可以向字符串尾部追加值
strlent key 字符串长度
getset key value 设置并返回原值
setrange key offeset value 设置指定位置的字符
getrange key start end 获取部分字符串
内部编码:
object encoding key // 查看内部编码
字符串类型编码有3种:
- int:8个字节的长整型
- embstr:小于等于39个字节的字符串
- raw:大于39个字节的字符串
Redis会根据当前值的类型和长度决定使用哪种内部编码实现。
典型应用场景:
缓存功能:
该函数用于获取用户的基础信息
首先从Redis获取用户信息
如果没有从Redis获取到用户信息,需要从Mysql中进行获取,并将结果回写到Redis,添加1小时过期时间
计数
例如视频播放数
共享session
使用Redis将用户的Session进行集中管理,在这种模式下保证Redis是高可用和可扩展的,每次用户更新或者查询登录信息都是从Redis中集中获取。
限速
限制用户每分钟获取验证码的频率
二、哈希
命令
设置值:hset key field value
获取值:hget key field
删除field: hdel key field [field ...]
返回结果为删除field成功的个数
计算field个数:hlen key
批量设置field-value:hmset key field value[field value ...]
批量获取field-value:hmget key field [field...]
判断field是否存在:hexists key field
获取所有field:hkeys key
获取所有value:hvals key
获取所有field-value:hgetall key
内部编码
- ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个),同时所有值都小于hash-max-ziplist-value配置(默认64个字节)时,Redis会使用ziplist作为哈希的内部实现
ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
- hashtable(哈希表):当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现。
因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)。
三、列表(List)
用来存储多个有序的字符串
- 列表中的元素时有序的
- 列表中元素时可以重复的
命令:
添加
从右边插入元素: rpush key value[value ...]
从左到右获取列表的所有元素:lrange key 0 -1
从左边插入元素:lpush key value[value ...]
向某个元素前或者后插入元素:linsert key before|after pivot value
查找
获取指定范围内的元素:lrange key start end
lrange操作会获取列表指定索引范围所有的元素。索引下标有两个特点:第一:索引下标从左到右分别是0到N-1,但是从右到左分别是-1到-N。第二:lrange中的end选项包含了自身,这个和很多编程语言不包含end不太相同。
获取列表指定索引下标的元素:lindex key index
获取列表长度:llen key
删除
从列表左侧弹出元素:lpop key
从列表右侧弹出元素:rpop key
删除指定元素:lrem key count value
count >0,从左到右,删除最多count个元素
count<0,从右到左,删除最多count绝对值个元素
count=0,删除所有
按照索引范围修剪列表:ltrim key start end
修改
lset key index newValue
阻塞操作
blpop brpop
内部编码:
- ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)
同时所有值都小于hash-max-ziplist-value配置(默认64个字节)时,Redis会使用ziplist作为哈希的内部实现。
- linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现。
使用场景
消息队列、文章列表
四、集合(Set)
保存多个字符串元素,不允许有重复元素,元素时无序的。
命令:
添加元素:sadd key element[element...]
删除元素:srem key element[element...]
计算元素个数:scard key
判断元素是否在集合中:sismember key element
随机从集合返回指定个数元素:srandmember key [count]
count是可选参数,如果不写默认为1
从集合随机弹出元素:spop key
获取所有元素:smembers myset
集合间操作
求多个集合的交集:sinter key [key...]
求多个集合的并集:suinon key [key...]
求多个集合的差集:sdiff key [key...]
内部编码
- intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时,
Redis会选用intset来作为集合内部实现,从而减少内存的使用。
- hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使用hashtable作为集合的内部实现。
五、有序集合
给每个元素设置一个分数(score)作为排序的依据。
元素不能重复,但score可以重复。
命令:
添加:zadd key score member[score member...]
计算成员个数:zcard key
计算某个成员分数:zscore key member
计算成员排名:
zrank key member 从低到高
zrevrank key member 从高到低
删除成员:zrem key member[member...]
增加成员的分数:zincrby key increment member
返回指定排名范围的成员:
zrange key start end [withscores]
zrevrange key start end [withscores]
返回指定分数范围的成员:
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key min max [withscores] [limit offset count]
返回指定分数范围成员个数:zcount key min max
内部编码
- ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个)
同时每个元素的值小于zset-max-ziplist-value配置(默认64个字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存使用。
- skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时zip的读写效率会下降。
使用场景
排行榜系统