一个分布式 Web 服务将用户的 Session 信息保存在各自服务器,但会造成一个问题,出于负载均衡的考虑,分布式服务会将用户的访问负载到不同服务器上,用户刷新一次可能会发现需要重新登陆。为解决该问题,可以使用 Redis 将用户的 Session 进行集中管理,在这种模式下只要保证 Redis 是高可用和扩展性的,每次用户更新或查询登录信息都直接从 Redis 集中获取。
限速
例如为了短信接口不被频繁访问会限制用户每分钟获取验证码的次数或者网站限制一个 IP 地址不能在一秒内访问超过 n 次。可以使用键过期策略和自增计数实现。
hash 4 Q1:简单说一说 hash 类型哈希类型指键值本身又是一个键值对结构,哈希类型中的映射关系叫 field-value,这里的 value 是指 field 对于的值而不是键对于的值。
Q2:你知道哪些 hash 的命令?设置值
hset key field value,如果设置成功会返回 1,反之会返回 0,此外还提供了 hsetnx 命令,作用和 setnx 类似,只是作用于由键变为 field。
获取值
hget key field,如果不存在会返回 nil。
删除 field
hdel key field [field...],会删除一个或多个 field,返回结果为删除成功 field 的个数。
计算 field 个数
hlen key批量设置或获取 field-value
12 hmget key field [field...]``hmset key field value [field value...]判断 field 是否存在
hexists key field,存在返回 1,否则返回 0。
获取所有的 field
hkeys key,返回指定哈希键的所有 field。
获取所有 value
hvals key,获取指定键的所有 value。
获取所有的 field-value
hgetall key,获取指定键的所有 field-value。
Q3:hash 的内部编码是什么?ziplist 压缩列表:当哈希类型元素个数和值小于配置值(默认 512 个和 64 字节)时会使用 ziplist 作为内部实现,使用更紧凑的结构实现多个元素的连续存储,在节省内存方面比 hashtable 更优秀。
hashtable 哈希表:当哈希类型无法满足 ziplist 的条件时会使用 hashtable 作为哈希的内部实现,因为此时 ziplist 的读写效率会下降,而 hashtable 的读写时间复杂度都为 O(1)。
Q4:hash 的应用场景有什么?缓存用户信息,每个用户属性使用一对 field-value,但只用一个键保存。
优点:简单直观,如果合理使用可以减少内存空间使用。
缺点:要控制哈希在 ziplist 和 hashtable 两种内部编码的转换,hashtable 会消耗更多内存。
list 4 Q1:简单说一说 list 类型list 是用来存储多个有序的字符串,列表中的每个字符串称为元素,一个列表最多可以存储 232-1 个元素。可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发中有很多应用场景。
list 有两个特点:① 列表中的元素是有序的,可以通过索引下标获取某个元素或者某个范围内的元素列表。② 列表中的元素可以重复。
Q2:你知道哪些 list 的命令?添加
从右边插入元素:rpush key value [value...]
从左到右获取列表的所有元素:lrange 0 -1
从左边插入元素:lpush key value [value...]
向某个元素前或者后插入元素:linsert key before|after pivot value,会在列表中找到等于 pivot 的元素,在其前或后插入一个新的元素 value。
查找
获取指定范围内的元素列表:lrange key start end,索引从左到右的范围是 0N-1,从右到左是 -1-N,lrange 中的 end 包含了自身。
获取列表指定索引下标的元素:lindex key index,获取最后一个元素可以使用 lindex key -1。
获取列表长度:llen key
删除
从列表左侧弹出元素:lpop key
从列表右侧弹出元素:rpop key
删除指定元素:lrem key count value,如果 count 大于 0,从左到右删除最多 count 个元素,如果 count 小于 0,从右到左删除最多个 count 绝对值个元素,如果 count 等于 0,删除所有。
按照索引范围修剪列表:ltrim key start end,只会保留 start ~ end 范围的元素。
修改
修改指定索引下标的元素:lset key index newValue。
阻塞操作
阻塞式弹出:blpop/brpop key [key...] timeout,timeout 表示阻塞时间。
当列表为空时,如果 timeout = 0,客户端会一直阻塞,如果在此期间添加了元素,客户端会立即返回。
如果是多个键,那么brpop会从左至右遍历键,一旦有一个键能弹出元素,客户端立即返回。
如果多个客户端对同一个键执行 brpop,那么最先执行该命令的客户端可以获取弹出的值。
Q3:list 的内部编码是什么?ziplist 压缩列表:跟哈希的 zipilist 相同,元素个数和大小小于配置值(默认 512 个和 64 字节)时使用。
linkedlist 链表:当列表类型无法满足 ziplist 的条件时会使用linkedlist。