通用命令
- 通用命令
- keys
- dbsize
- exists key
- del key [key…]
- expire key seconds
- type key
keys(一般不在生产环境中使用)
keys * # 遍历所有key 127.0.0.1:6379> set hello world OK 127.0.0.1:6379> set php good OK 127.0.0.1:6379> set java best OK 127.0.0.1:6379> keys * 1) "hello" 2) "java" 3) "php" keys [pattern] # 使用通配符 127.0.0.1:6379> mset hello world heh haha php good phe his OK 127.0.0.1:6379> keys he* 1) "heh" 2) "hello" 127.0.0.1:6379> keys he[h-l]* 1) "heh" 2) "hello" 127.0.0.1:6379> keys ph? 1) "php" 2) "phe" 由于redis是基于单线程,在生成环境中使用keys命令会造成其他线程的阻塞,如果需要使用keys的话可以使用一下方式代替(以后的博客会补充) 1. 热备从节点 2. 使用scan
dbsize
dbsize #计算key的总数 127.0.0.1:6379> dbsize (integer) 5
exists
exists key #检查key是否存在 127.0.0.1:6379> set a b OK 127.0.0.1:6379> exists a (integer) 1 (1代表存在) 127.0.0.1:6379> del a (integer) 1 127.0.0.1:6379> exists a (integer) 0 (0代表不存在)
del
del key #删除指定的key-value 127.0.0.1:6379> set c d OK 127.0.0.1:6379> del a c (integer) 1 (1代表删除成功) 127.0.0.1:6379> exists c (integer) 0
expire,ttl,persist
expire key seconds #key在seconds秒后过期 ttl key #查看key剩余的过期时间 persist key #清除key的过期时间 127.0.0.1:6379> set hello world OK 127.0.0.1:6379> expire hello 10 (integer) 1 127.0.0.1:6379> ttl hello (integer) 7 127.0.0.1:6379> ttl hello (integer) -2 (-2代表已经过期,被删除) 127.0.0.1:6379> set hello world OK 127.0.0.1:6379> expire hello 20 (integer) 1 127.0.0.1:6379> ttl hello (integer) 16 127.0.0.1:6379> persist hello (integer) 1 127.0.0.1:6379> ttl hello (integer) -1 (-1代表没有设置过期时间)
type
type key #返回key的类型 127.0.0.1:6379> set str stri OK 127.0.0.1:6379> type str string 127.0.0.1:6379> sadd myset 1 2 3 (integer) 3 127.0.0.1:6379> type myset set redis的type有string,hash,list,set,zset,none
- 时间复杂度
命令 | 时间复杂度 |
---|---|
keys | O(n) |
dbsize | O(1) |
del | O(1) |
exists | O(1) |
expire | O(1) |
type | O(1) |
数据结构
字符串
- 键值对 key-value
API
get key # 获取key对应的value set key value # 设置key-value del key # 删除key-value incr key # key自增1,如果key不存在,自增后get(key)=1 decr key # key自减1,如果key不存在,自减后get(key)=-1 incrby key k # key自增k,如果key不存在,自增后get(key)=k decr key k # key自减k,如果key不存在,自减后get(ke y)=-k set key value # 不管key是否存在,都设置 setnx key value # key不存在,才设置 set key value xx # 当key存在,才设置 mget key1 key2 key3 ... # 批量获取key,原子操作(相较之于多次执行单次查询, 每次查询都会连接一次网络,批量操作节约了大量的网络时间) mset key1 value1 key2 value2 ... # 批量设置key-value getset key newvalue # set key newvalue并返回旧的value append key value # 将value追加到旧的value strlen key # 返回字符串的长度(注意中文) incrbyfloat key 3.5 # 增加key对应的值3.5 getrange key start end # 获取字符串指定下标所有的值 setrange key index value # 设置指定下标所有对应的值
实战:
- 记录网站每个用户个人主页的访问量
incr userid:pageview(单线程:无竞争)
缓存视频的基本信息(数据源在mysql中)伪代码
public VideoInfo get(long id){ String redisKey = redisPrefix + id; VideoInfo videoInfo = redis.get(redisKey); if(videoInfo == null){ videoInfo = mysql.get(id); if(videoInfo!=null){ //序列化 redis.set(redisKey,serialize(videoInfo)); } } }
分布式id生成器
incr id(原子操作)
- 记录网站每个用户个人主页的访问量
哈希
- key-field-value(相当于map中存的是map)
API
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 hlen key # 获取hash key field的数量 hmget key field1 field2... # 批量获取hash key的一批field对应的值 hmset key field1 value1 field2 value2... # 批量设置hash key的一批field value hgetall key # 返回hash key对应所有field的和value hvals key # 返回hash key对应所有field的value hkeys key # 返回hash key对应所有的field hsetnx key field value # 设置hash key对应的field的value(如果field已经存在,则失败) hincrby key field intCounter # hash key 对应的field的value自增intCounter hincrbyfloat key field floatCounter # 自增浮点数
实战
- 记录个人网站主页访问量
hincrby user:1:info pageview count
缓存视频的基本信息(数据源在mysql中)伪代码
public VideoInfo get(long id){ String redisKey = redisPrefix + id; Map<String,String> hashMap = redis.hgetAll(redisKey); VideoInfo videoInfo = transferMapToVideo(hashMap); if(videoInfo == null){ videoInfo = mysql.get(id); if(videoInfo!=null){ redis.hmset(redisKey,transferVideoToMap(videoInfo)); } } return videoInfo; }
list
- key-elements
API
rpush key value1 value2...valueN # 从列表右端插入值(1-N)个 lpush key value1 value2...valueN # 从列表左端插入值(1-N)个 lpop key # 从列表左侧弹出一个item rpop key # 从列表右侧弹出一个item lrem key count value # 根据count值,从列表中删除所有value相等的项 (1)count>0,从左到右,删除最多count个value相等的项 (2)count<0,从右到左,删除最多Math.abs(count)个value相等的项 (3)count=0,删除所有value相等的项 ltrim key start end # 按照索引范围修剪列表 lrange key start end(包含end) # 获取列表指定索引范围所有item lindex key index # 获取列表指定索引的item llen key #获取列表长度 lset key index newValue # 设置列表指定索引值为newValue blpop key timeout # lpop阻塞版本,timeout是阻塞超市时间,timeout=0是永远不阻塞 brpop key timeout # rpop阻塞版本,timeout是阻塞超市时间,timeout=0是永远不阻塞
集合
- key-values(无序,不允许有重复元素,相当于set)
API
sadd key element # 向集合key添加element(如果element已经存在,添加失败) srem key element # 将集合key中的element移出掉 scard key # 计算集合大小 sismember key item # 判断item是否属于集合(1存在,0不存在) srandmember key count # 从集合中随机取出count个元素 spop key # 从集合中随机弹出一个元素 smembers key # 取出集合中所有的元素(返回结果是无序的,涉及到遍历,小心使用) 假设存在两个集合: 1. s1:a,b,c 2. s2:a,c,d sdiff(差集): sdiff s1 s2 = b sdiff s2 s1 = d sinter(交集): sinter s1 s2 = a c sunion(并集): sunion s1 s2 = b a d c 将以上结果存储在指定集合(destkey): sdiff|sinter|sunion + store destkey
有序集合
- key-value(score-value)本身无序,使用score排序
API
zadd key score element(可以是多对) # 添加score和element zrem key element(可以是多个) # 删除元素 zscore key element # 返回元素的分数 zincrby key increScore element # 增加或减少元素的分数 zcard key # 返回元素的总个数 zrange key start end[WITHSCORES](zrevrange 倒序) # 返回指定索引范围内的升序元素[分值] zrangebyscore key minScore maxScore[WITHSCORES](zrevrangebyscore 倒序) # 返回指定分数范围的升序元素[分值] zcount key minScore maxScore # 返回有序集合内在指定分数范围内的个数 zremrangebyrank key start end # 删除指定排名内的升序元素 zremrangebyscore key minScore maxScore # 删除指定分数内的升序元素 zrank key member # 获取memeber元素对应的排名(升序,zrevrank倒序) zinterstore destination numkey key[key...] [WEIGHTS weight] [AGGREGATE sum|min|max] # 用于对给定的有序集合执行交集运算,运算结果集存储到DESTINATION中 # numkey是有序集合的数量; # WEIGHTS选项,用于指定一个乘法因子,有序集合中每个成员的SCORE值乘以该因子后,结果传递给聚合函数。并且,乘法因子的设置需要根据有序集合的个数分别指定。默认为1。 # AGGREGATE选项,用于指定该交集的结果集的聚合方式。默认使用的是SUM。 ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] # 求并集