网站工程师的职责,wordpress+显示异常,ui设计线上培训,百度官网推广平台电话目录
五种基础数据结构
string
hash
list
set
zset
用zset实现微博热搜
scan遍历
高频问题 五种基础数据结构
string
单个赋值set 批量赋值/取值
msetmget 设置不存在字符串setnx, 如果不存在, 则设置成功返回1, 如果存在返回0, 可以当做分布式锁 删除值 设置过期时…目录
五种基础数据结构
string
hash
list
set
zset
用zset实现微博热搜
scan遍历
高频问题 五种基础数据结构
string
单个赋值set 批量赋值/取值
msetmget 设置不存在字符串setnx, 如果不存在, 则设置成功返回1, 如果存在返回0, 可以当做分布式锁 删除值 设置过期时间/查看过期时间
expire key timettl key 数字自增 设置分布式锁 setnx order:1 true // 返回1代表获取锁成功 // 执行业务 del order:1 set order:1 true ex 15 nx // 加上过期时间, 防止死不释放 hash
设置hash的key field value 批量设置hash field 获取hash所有属性 删除hash某个属性 hash和string(非json)存储对象对比
优点:
hash能规整同类数据, 便于管理hash更节省空间(key少)hash对部分属性的更新性能更好
缺点:
过期时间只能在key上, 不能在属性上在集群架构不适合大规模使用不适用field过多, 避免big key list
lpush key val1 val2 从左边放入元素
rpush key val1 val2 从右边放入元素
lpop key len 从左边拿len个元素
rpop key len 从右边拿len个元素
实现栈结构-FILO 实现队列结构-FIFO blpop key len timeout 从左边拿len个元素,没有元素就阻塞timeout秒, 如果timeout0就一直阻塞 lpushbrpop阻塞队列
lrange key start end 批量获取队列元素(不会移除,元素还在) set
sadd key val1 val2 val3 批量往集合添加元素
scard key 获取集合个数
srem key val1 移除集合元素
sismembers key 获取集合所有元素
sismember key val1 判断集合是否存在该元素 srandmember key 3 从集合选出3个元素, 不删除
spop key 3 从集合选出3个元素, 并且从集合中删除 sinter key1 key2 取交集
sinterstore des1 key1 key2 取交集并存入新的集合des1 sunion key1 key2 取并集
sunion des2 key1 key2 取并集存入新的集合des2 sdiff key1 key2 key3 取差集
sdiffstore des2 key1 key2 key3 取差集并存入新的集合 应用
用srandmember/spop实现抽奖功能用sinter/sunion/sdiff实现关注模型(可能认识的人) zset
zadd key score val 往集合添加key和分数和值
zscore key val 获取集合元素分值
zrange key start end 按分值升序
zrevrange key start end 按分值降序 zunion numkeys key1 key2 并集计算
zinter numkeys key1 key2 交集计算
zdiff numkeys key1 key2 差集计算 用zset实现微博热搜
1. 点击一条消息
zincrby key incr val 2. 展示当日前五
zrevrange hotnew:231126 0 5 withscores 3. 七日搜索榜单
zunionstore hotnew:231119-231126 7 hotnew:231119 hotnew:231120 ... hotnew:231123
4. 七日搜索榜单
zrevrange hotnew:231119-231126 0 5 withscores scan遍历
SCAN cursor [MATCH pattern] [COUNT count]
cursor(hash桶的索引值):游标, 从0开始遍历, 每次用返回的值替换下一次检索的游标, 结束时返回0
pattern:正则表达式
count: 返回结果个数近似值 注意scan并非完美无瑕 如果在scan的过程中如果有键的变化增加、 删除、 修改 可能会碰到下面问题 新增的键可能没有遍历到 重复遍历键等 也就是说scan并不能保证完整的遍历出来所有的键 高频问题
1. redis是单线程吗?
只有键值读写是单线程, 其他的持久化,过期删除,集群同步都是额外线程执行. 2. redis为什么高性能?
所有数据都存内存中, 都是内存级别运算IO多路复用,redis利用epoll来实现IO多路复用将连接信息和事件放到队列中依次放到文件事件分派器事件分派器将事件分发给事件处理器单线程执行,没有上下文切换