Redis的通用命令
keys * 遍历所有的key O(n)
keys [pattern] 遍历符合条件的key。例如keys he*,将匹配以he开头的键;keys he[h-l]*将匹配以he开头并且第三个字母在h-lq区间的键;keys ph前两位是ph的key。
dbsize 计算key的总数 O(1)
exists key key是否存在 O(1)
del key 删除对应key-value O(1)
expire key seconds key在指定秒数后过期。 O(1)
ttl key 查看剩余过期时间 O(1)
type key 返回key的类型 O(1)
注意:keys 命令不建议在生产环境使用,因为它是o(n)命令,生产环境通常来说键值对很多,因为Redis的单线程特性可能会阻塞其他命令。
热备从节点:从节点可以重复复制主节点的数据。一般来说从节点不在生产环境使用,所有可以使用些重命令。2、scan命令
字符串
key都是字符串,value可以是五种数据类型。本质上value都是二进制字符串,最大大小512MB,但因为有其他开销通常更低。
使用场景:缓存、计数器、分布式锁
get key 获取对应键的值 O(1)
set key value 设置对应键的值 O(1)
del key 删除对应键值 O(1)
incr key 指定键的值自增1,
如果Key不存在, 自增后get(key)=1 O(1)
decr key 指定键的值自减1,
如果Key不存在, 自减后get(key)=-1 O(1)
setnx key value key不存在时,才生效 O(1)
set key value xx key存在时,才生效 O(1)
mset k1 v1 k2 v2...kn vn 设置多个键值对 O(n)
getset key newValue 设置对应Key为newValue,同时返回旧的value O(1)
append key value 将value追加到旧的value O(1)
strlen key 返回字符串的长度(注意中文) O(1)
incrbyfloat key 3.5 key对应的值加3.5 O(1)
getrange key start end 获取字符串指定下标所有的值(下标从0开始) O(1)
setrange key index value 设定指定下标所对应的值 O(1)
实战场景:
记录网站每个用户个人主页的访问量:incr userid:pageview(键名)(单线程:无竞争。不会出错)
缓存视频的基本信息(数据源在MySQL中)
分布式id生成器:三个应用,我们希望三个应用每次获取的Id自增:incr
哈希
key为字符串,值分为两部分field和value,视为属性和值。可以把key当作一张表的一行,Key就代表一个id,每个属性可以看作关系型数据库的一个字段。fields不能相同,value可以。
hget key field 获取hash key对应的field的value
hset key field value 设置hash key对应field的value
hdel key field 删除hash key对应field的value
hexists key field 判断hash key是否有field
hgetall key 返回所有field。小心该命令,很多key的情况下可能造成阻塞。
hlen key 获取hash key field的数量 O(n)
hmget key field1 field2... field n 批量获取hash key的一批值 O(n)
hmset set f1 v1 f2 v2... 批量设置值 O(n)
hvals key 返回hash key对应所有field的value O(n)
hkeys key 返回hash key对应所有field O(n)
hsetnx key field value 设置Hash key对应的field的value(如果field存在,则失效)。
hincrby key field intCounter value 自增intCounter
hincrbyfloat 自增小数
实战场景:
记录网站每个用户个人主页的访问量:hincrby user:1:info pageviewcount
缓存视频的基本信息(数据源在Mysql中)
列表
key是字符串,value是一个有序的list。特点是有序、可以重复。
rpush key v1 v2 v3 ...vn 从列表右端插入值 o(1~n)
lpush 从列表左端插入,和列表右端用法一致o(1~n)
linsert key before|after value newValue 在list指定的值前后插入newValueo(n)
lpop key 从左弹出一个item o(n)
lrem key count value 根据count的值,从列表中删除所有value相等的项:
count>0, 从左到右,删除最多count个value相等的值
count<0, 从右到左,删除最多Math.abs(count)个v相等的值
count=0, 删除所有v相等的项
lrim key start end 按照索引范围修剪列表
lrange key start end 获取列表指定索引范围所有item
lindex key index 获取列表指定索引item
llen key 获取列表长度
lset key index newValue 设置列表指定索引值为newV o(n)
blpop b代表阻塞的概念。 blpop key timeout 是lpop的阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞。
brpop 跟blpop一样,只不过从右边获取
实战场景:
微博时间轴功能,微博从新到旧的顺序排列。每一个微博是一个对象,例如hash或字符串。然后你的微博Id作为key,你可以lrange获取0~10条微博然后mset获取所有内容,再序列化做出接口。
Tips:
LRUSH + LPOP = Stack
LUSH + RPOP = Queue
LPUSH + LTRIM = Capped Collection
LPUSH + BRPOP = Message Quene
集合
values无序的、不重复的。可以想到数学里集合的概念。交集、并集和差集分别对应方法: sinter, sunion, sdiff。
sadd key element 向集合Key添加element,若存在则失败
srem key element 将集合key中的element移除掉
scard key 计算集合大小,也就是element的数量
sismenber key element 判断element是否在集合中
srandmember key count 在集合中随机挑count个元素,该方法对比spop不会破坏集合。
spop key 从集合中随机弹出一个元素
smembers key 获取集合所有元素。返回结果无序,如果member多,注意阻塞
sinter/sunion/sdiff key1 key2
sinter/sunion/sdiff + store destkey 将差集、交集和并集结果保存在destkey中
实战场景:
微博转发抽奖平台,can be spop
点赞 踩
标签tag 给用户添加标签: sadd user:1:tags tag1 tag2 给标签添加用户:略 可以将这两个操作放在同一个事务内。
共同关注
TIPS
sadd = Tagging
spop/srandmember = random item
sadd + sinter = social graph 社交相关应用
有序集合
相对于集合:同样无重复元素、有序、element + score
相对于列表: 无重复元素
zadd key score element(可以是多对) 添加score和element O(logN)
zrem key element 删除 O(1)
zscore key element 返回元素的分数 O(1)
zincrby key increScore element 增加或减少元素的分数 O(1)
zcard key 返回元素的总个数 O(1)
zrank key value 返回对应值的排名
zrange key 0 -1 withscores 0-1是值所有范围,返回指定索引范围内的升序元素 o(log(n) + m) n指元素个数,m索引范围内的个数
zrangebyscore key minScore maxScore [withscore] 返回指定分数范围内的升序元素 o(log(n) + m) n指元素个数,m索引范围内的个数
zcount key minScore maxScore 返回有序集合内在指定分数范围内的个数 o(log(n) + m) n指元素个数,m索引范围内的个数
zremrangebyrank 删除指定排名内的升序元素 o(log(n) + m) n指元素个数,m索引范围内的个数
zremrangebyscore 删除指定分数内的升序元素 o(log(n) + m) n指元素个数,m索引范围内的个数
zrevrank
zrevrange
zrervrangebyscore
zinterscore
zunionstore
实战
排行榜:分数添加更新,等等 score: timeStamp saleCount followCount
Redis两种持久化方式的区别
RDB方式是通过快照方式完成的 持久化
定时生成 RDB 快照非常便于进行数据库备份 建议使用 为了安全两种都要使用
RDB 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集
AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
Redis的高可用方案
互联网应用特征:高可用、高性能、高并发。
redis作为中间缓存层一般高可用的设计方案为
1:keepalived 通过keepalived提供的虚拟IP,提供主从的统一访问,当主出现问题时,通过keepalived运行脚本将从提升为主,待主恢复以后,从和主先进行同步,然后已经恢复的主自动变为主,该方案好处是,主从切换时,应用程序不需要知道变化了(因为使用了虚拟ip).缺点是有些情况下会由于切换丢失数据,而且增加了部署的复杂性。
2: zookeeper 通过zookeeper来监控主从实例,维护最新的有效的ip,应用通过zookeeper订阅获取ip,然后对redis进行访问和操作,zookeeper解决单点故障的,服务注册和发现的。
3: sentinel:哨兵模式,相当于zookeeper,官方推荐。