字符串 编码:raw、int、embstr
特点 value可以为string、int、2进制,最大值512mb
API 1 2 3 4 5 6 7 8 9 10 11 12 13 14 get key # 根据key获取数据set key value # 新增del key # 根据key删除数据incr key # key自增1 如果key不存在,自增后,get(key)=1decr key # key 自减1,若key不存在,自减后get(key)=-1incrby key k # key自增到k,若果key不存在,自增后get(key)=kdecrby key k # key自减到k,若果key不存在,自减后get(key)=-k
使用场景 网站访问量 incr userid:pageciew (单线程:无竞争)
缓存 视频的基本信息(数据源在mysql),先访问redis,存在即取,不存在,则取mysql 伪代码:1 2 3 4 5 6 7 8 9 10 11 12 public videoInfoget (long id) { String redisKey = redisPrefix+id; VideoInfo v =redis.get(redisKey); if (v==null ){ v=mysql.get(id); if (v!=null ){ redis.set(redisKey,serialize(v)) } } return v; }
不常用API 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 set key value # 不管key是否存在都设置setnx key value # key不存在才设置(相当于新增)set key value xx # key存在才设置(相当于更新)mget key1 key2 key3 key 4 # 批量获取key 原子操作mset key1 value1 key2 value2 key3 value3 # 批量设置key-valuegetset key newvalue # set key newvalue并返回旧的value,即先get后setappend key value # 将value追加到旧的valuestrlen key # 返回字符串的长度(注意中文)incrbyfloat key 3.5 # 增加key到3.5getrange key start end # 获取字符串指定下标所有的值setrange key index value # 设置指定下标所有对应的值eg: set hello javabest getrange hello 0 2 # javsetrange hello 4 p get hello # javapest
n次get=n次网络时间+n次命令时间 1次mget=1次网络时间+n次命令时间
注意:mget不能太多计数,可拆分 提高性能
hash 编码:hashtable、ziplist
特点 结构为key field value,key为字符串,value为对象
API 1 2 3 4 5 6 7 8 9 10 11 12 13 14 hget key filed # 获取hash key对应的field的valuehset key field value # 设置hash key对应filed的valuehdel key field # 删除hash key对应的filie的valuehexists key field # 判断hash key是否有fieldhlen key # 获取hash key field的数量hmget key field1 field2 # 批量获取hash key对应的field的valuehmset key field1 value1 filed2 value2 # 批量设置hash key对应filed的value
使用场景 记录访问量 1 hincrby user:1:info pageview count
缓存 1 2 3 4 5 6 7 8 9 10 11 12 public videoInfoget (long id) { String redisKey = redisPrefix+id; Map<string,string> mao =redis.get(redisKey); videoinfo v =transferMapTovideo(map); if (v==null ){ v=mysql.get(id); if (v!=null ){ redis.hmset(redisKey,transfervideoToMap(v)) } } return v; }
不常用API 1 2 3 4 5 6 7 8 9 10 11 12 13 hgetall key # 返回hash key对应的所有field和valuehvals key # 返回hash key对应的所有field的valuehkeys key # 返回hash key对应的所有field# hgetall,单线程小心使用hsetnx key filed value # 没有才增加hincrby key filed count # 增加到counthincrbyfloat key field floatcount # 增加到浮点floatcount
list 编码:linklist、ziplist
特点 API 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 rpush key value1 value2 value3 # 从列表右端插入值push key value1 value2 value3 # 从列表左端插入值linsert key before|after value new Value # 在list指定值的前后插入newvalue,遍历实现的eg: # abcdlinsert listkey before b java # ajavabclinsert list key after b php # abphpcdlpop key # 从左边弹出item# abcdlpop listkey # bcdrpop # abclrem key value # 根据count值,从列表中删除所有的value相等的项# 1count>0 从左到右 删除最多和count个value相等的项# 2count<0 从右边到左边 删除最多Math.abs(count)个value相等的项 绝对值# 3count=0 删除所有value相等的项ltrim key start end # 按照索引范围修建列表# abcdefltrim listkey 14 # bcde 从0开始lrange key start end 包含 # 获取列表指定索引范围所有的元素# abcdef# 索引从左 0 5# 从右 索引 -1 -6lrange listkey 02 # abclrange list key 1 -1 # bcdeflindex key index # 获取列表指定的元素# abcfeflindex listkey 0 # alindex listkey -1 # fllen key # 获取列表长度lset key index newvalue # 设置列表指定索引值为newvalue rpush mylist a b c lrange listkey 0 -1 # a# b# c lpush listkey 0 lrange listkey 0 -1 # 0# a# b# c rpop listkey lrange listkey 0 -1 # 0# a# b
使用场景 lpush+lpop=stack lpush+rpop=queue lpush+ltrim=capped collection lpush+brpop=message queue
不常用API 1 2 3 4 blpop key timeout # lpop阻塞版本,timeout是阻塞超时时间timeout=0永远不阻塞brpop key timeout # lpop阻塞版本,timeout是阻塞超时时间timeout=0永远不阻塞
set 编码:hashtable、intset
特点 API 1 2 3 4 5 6 7 8 9 10 11 12 13 14 sadd key element # 向集合key添加element 如果element存在添加失败,可添加多个srem key element # 将集合key中的element移除掉scard key # 计算集合大小,key的个数sismember key it # 判断it是否存在集合中srandmemeber key count # 从集合中随机选count个元素spop key # 从集合中随机弹出一个元素smembers key # 获取所有元素,无序的 小心使用
使用场景 抽奖系统、点赞、踩、计数、标签、共同关注。 sadd 标签 spop/srandmember 随机 sadd+sinter 社交
不常用API 1 2 3 4 5 6 7 8 sdiff key1 key2 # 差集sinter key1 key2 # 交集sunnion key1 key2 # 并集sdiff|sinter|sunion + store destkey # 将差并交结果保存入deskey中
zset 编码:skiplist、ziplist 结构为:key score value
特点 API 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 zadd key score element # 添加score 和element,可以多对# 时间复杂度 O(logN)zrem key element # 删除元素,可以多个zscore key element # 返回元素的分数zincrby key incresore element # 增加或者减少元素的分数zincrby key 9 mike # 给mike增加9分zcard key # 返回元素的总数zrank key element # 获取元素排名 按照分数从小到达zrange key 0 -1 withscores # 返回指定索引范围生序元素(分值打印)zrangebysrore key minScore maxscore withscores # 返回指定分数范围内的升序元素zcount key minScore maxscore # 返回有序集合内在指定分数范围内的个数zremrangebyrank key start end # 删除指定排名内的升序元素zremrangebyrank key 1 2 # 删除第2名 第3名zremrangebyscore key minScore maxScore # 删除指定分数内的升序元素zremrangebyscore key 90 210 # 删除分数在90到210的值
使用场景 排行榜
不常用API 1 2 3 4 5 6 7 8 9 10 zrevrank # 获取元素排名 按照分数从大到小zrevrange # 返回指定索引范围倒序元素zrevrangebyscore # 返回指定分数范围内的倒序元素zinterstore # 交集存储zunionstore # 并集存储