本篇幅主要涉及Redis的配置、基础命令、四种数据类型的操作命令
Redis是Remote Dictionary Server远程字典服务器的缩写,它以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容。到目前为止Redis支持的键值数据类型如下
- 1.字符串
- 2.散列类型
- 3.列表类型
- 4.集合类型
- 5.有序集合类型
Redis命令返回值
1.状态回复:状态回复(status reply)是最简单的一种回复,比如向Redis发送SET命令设置某个键的值时,Redis会回复状态OK表示设置成功。
redis>PING
PONG
2.错误回复:当出现命令不存在或命令格式有错误等情况时Redis会返回错误回复(error reply)。错误回复以(error)开头,并在后面跟上错误信息。如执行一个不存在的命令:
redis>ERRORCOMMAND
(error) ERR unknown command 'ERRORCOMMAND'
3.整数回复:Redis虽然没有整数类型,但是却提供了一些用于整数操作的命令,如递增键值的INCR命令会以整数形式返回递增后的键值。除此之外,一些其他命令也会返回整数,如可以获取当前数据库中键的数量的DBSIZE命令等。
redis>INCR foo
1
4.字符串回复:字符串回复(bulk reply)是最常见的一种回复类型,当请求一个字符串类型键的键值或一个其他类型键中的某个元素时就会得到一个字符串回复
redis>GET foo
"hello"
5.多行字符串回复:多行字符串回复(multi-bulk reply)同样很常见,如当请求一个非字符串类型键的元素列表时就会收到多行字符串回复。多行字符串回复中的每行字符串都以一个序号开头,如:
redis>KEYS *
1) "bar"
2) "foo"
Redis启动配置:
1.启用配置文件
redis-server /path/to/redis.conf
2.通过启动参数传递同名配置项覆盖配置文件中的相应参数
redis-server /path/to/redis.conf --loglevel warning
redis-server --port 6380
Redis基础命令
1.获得符合pattern的键名列表
keys pattern
KEYS命令需要遍历Redis中所有键,当键的数量较多时会影响性能,不建议在生产环境中使用
eg:返回redis中的所有键
redis>KEYS *
2.判断一个键是否存在
EXISTS key
3.删除键:不支持通配符匹配
DEL key [key...]
eg:删除键bar、foo
redis>DEL bar foo
4.获得键值的数据类型
TYPE key
Redis数据类型之String
1.赋值与取值
SET key value
GET key
2.递增数字:只当键为数字时该命令好用
INCR key
3.给key增加指定的整数只当键为数字时该命令好用
INCRBY key increment
4.减少指定的整数
DECR key
DECRBY key decrement
5.向尾部追加值
APPEND key value
6.获取字符串的 长度
STRLEN key
7.同时获得/设置多个键值
MGET key [key...]
MSET key value [key value...]
8.位操作
GETBIT key offset
SETBIT key offset value
BITCOUNT key [start] [end]
BITOP [OR|AND] destination key [key...]
Redis数据类型之散列类型
1.赋值与取值:HSET命令的方便之处在于不区分插入和更新操作,这意味着修改数据时不用事先判断字段是否存在来决定要执行的是插入操作(update)还是更新操作(insert)。当执行的是插入操作时(即之前字段不存在)HSET命令会返回1,当执行的是更新操作时(即之前字段已经存在)HSET命令会返回0。更进一步,当键本身不存在时,HSET命令还会自动建立它。
HSET key field value
HGET key field
HMSET key field value[field value...]
HMGET key field [field...]
HGETALL key
2.判断字段是否存在
HEXISTS key field
3.当字段不存在是赋值:该命令是原子操作,不需要担心并发问题
HSETNX key field value
4.增加数字:命令会自动建立该键并默认field字段在执行命令前的值为0
HINCRBY key field increment
5.删除字段:返回被删除字段的数量
HDEL key field [field...]
6.只获取字段名或字段值
HKEYS key
HVALS key
7.获取字段的数量
HLEN key
注:可以通过Redis的bit操作实现bitmap;使用bitmap的场景统计100万个用户的一年内登录天数和亿级别数据量重复数据查找
Redis数据类型之列表类型(可以类比java中的数组)
1.向列表两端加入元素
LPUSH key value[value...] //向列表左边加入元素
RPUSH key value[value...] //想列表右边加入元素
2.从列表两端弹出元素,弹出后元素就不在列表中了
LPOP key
RPOP key
- 上面提到的4个命令可以使用列表类型来模拟栈和队列的操作:如果想把列表当做栈,则搭配使用LPUSH和LPOP或RPUSH和RPOP,如果想当成队列,则搭配使用LPUSH和RPOP或RPUSH和LPOP。
3.获取列表中元素的个数:当键不存在时LLEN返回0
LLEN key
4.获得列表元素片段:并不会删除列表中的元素
LRANGE key start stop //返回从start到stop之间的元素,start从0开始
- LRANGE命令支持负索引,表示从右边开始计算序数,如"-1"表示最右边第一个元素,"-2"表示最右边第二个元素,依次类推:显然,LRANGE numbers 0-1可以获取列表中的所有元素。另外一些特殊情况如下。
5.删除列表中指定的元素
LREM key count value
LREM命令会删除列表中前count个值为value的元素,返回值是实际删除的元素个数。根据count值的不同,LREM命令的执行方式会略有差异:
- ● 当count > 0时LREM命令会从列表左边开始删除前 count个值为 value的元素;
- ● 当count < 0时LREM命令会从列表右边开始删除前|count|个值为value的元素;
- ● 当count = 0是LREM命令会删除所有值为value的元素。例如:
6.获得或者给指定索引元素的值;类似java中数组的的arr[index]
LINDEX key index
LSET key index value
- 如果index是负数则表示从右边开始计算的索引,最右边元素的索引是-1。
7.保留列表指定片段
LTRIM key start end
8.想列表中插入元素
LINSERT key BEFORE|AFTER pivot value
- LINSERT命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。
9.将元素从一个列表转到另一个列表,先执行RPOP命令再执行LPUSH命令。RPOPLPUSH命令会先从source列表类型键的右边弹出一个元素,然后将其加入到destination列表类型键的左边,并返回这个元素的值,整个过程是原子的。
RPOPLPUSH source destination
当把列表类型作为队列使用时,RPOPLPUSH命令可以很直观地在多个队列中传递数据。当source和destination相同时,RPOPLPUSH命令会不断地将队尾的元素移到队首,借助这个特性我们可以实现一个网站监控系统:使用一个队列存储需要监控的网址,然后监控程序不断地使用RPOPLPUSH命令循环取出一个网址来测试可用性。这里使用RPOPLPUSH命令的好处在于在程序执行过程中仍然可以不断地向网址列表中加入新网址,而且整个系统容易扩展,允许多个客户端同时处理队列。
Redis数据类型之集合类型(类比java中的HashSet)
1,增加删除元素:添加删除集合中不存在的元素到集合,返回添加删除成功的元素数量
SADD key member [member...]
SREM key member [member..,]
2,获得集合所有元素
SMEMBERS key
3.判断元素是否在集合中,存在返回1否则返回0
SISMEMBER key member
4.集合间的运算
SDIFF key [key...] //求集合之间的差集
SINTER key [key..] //求集合之间的交集
SUNION key [key..] //求集合之间的并集
5.获得集合中元素个数
SCARD key
6.进行集合运算并将结果存储:和SDIFF、SINTER、SUNION差不多不过是把运算结果存在destination键中。
SDIFFSTORE destination key [key...]
SINTERSTORE destination key [key...]
SUNIONSTORE destination key [key...]
7.随机获得集合中的元素
SRANDMEMBER key [count]
还可以传递count参数来一次随机获得多个元素,根据count的正负不同,具体表现也不同。
- (1)当count为正数时,SRANDMEMBER会随机从集合里获得count个不重复的元素。如果count的值大于集合中的元素个数,则SRANDMEMBER会返回集合中的全部元素。
- (2)当 count 为负数时,SRANDMEMBER会随机从集合里获得|count|个的元素,这些元素有可能相同。
原理:使用SRANDMEMBER命令从集合中获得一个随机元素时,Redis首先会从所有桶中随机选择一个桶,然后再从桶中的所有元素中随机选择一个元素,所以元素所在的桶中的元素数量越少,其被随机选中的可能性就越大,如图
8.从集合中弹出一个元素,类似列表的LPOP,作用是从列表左边弹出一个元素(即返回元素的值并删除它)。SPOP命令的作用与之类似,但由于集合类型的元素是无序的,所以SPOP命令会从集合中随机选择一个元素弹出
SPOP key
Redis数据类型之有序集合类型
1.增加元素:ZADD命令用来向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数,分数支持整数和浮点数
ZADD key score member [score member...]
2.获得元素分数
ZSCORE key member
3.获得排名在某个范围的元素列表,WITHSCORES参数使命令不仅返回member还会返回score
ZRANGE key start stop [WITHSCORES] //从小到大返回索引start到stop之间的元素
ZREVRANGE key start stop [WITHSCORES]//从大到小返回索引start到stop之间的元素
- 如果两个元素的分数相同,Redis会按照字典顺序(即"0" < "9" < "A" < "Z" < "a" < "z"这样的顺序)来进行排列。再进一步,如果元素的值是中文怎么处理呢?答案是取决于中文的编码方式
4.获得指定分数范围内的元素
ZRANGEBYSCORE key min max [WITHSCORES] [limit offset count]
该命令按照元素分数从小到大的顺序返回分数在min和max之间(包含min和max)的元素;如果希望分数范围不包括端点值,可以在min或者max之前加上"("修饰。同时min max支持正负无穷大,-inf和+inf分别表示正无穷和负无穷大;
eg:获取scoreboard键分数在80(不包括80)到无穷大之间的member
ZRANGEBYSCORE scoreboard (80 +inf
limit offset count等价于MYSQL的分页这里不再赘述
5.增加某个元素的分数;返回增加后的分数
ZINCRBY key increment member
6.获得集合中元素的数量
ZCARD key
7.获得指定分数范围内元素数量;ZCOUNT命令的min和max参数的特性与ZRANGEBYSCORE命令中的一样:
ZCOUNT key min max
8.删除一个或者多个元素;返回值是成功删除元素的数量
ZREM key member [member...]
9.按照排名删除元素
ZREMRANGEBYRANK key start stop
- ZREMRANGEBYRANK命令按照元素分数从小到大的顺序(即索引0表示最小的值)删除处在指定排名范围内的所有元素,并返回删除的元素数量。
10.按照分数范围删除元素
ZREMRANGEBYSCORE key min max
11.获得元素排名
ZRANK key member //获得指定元素从小到大的元素排名,排名从0开始
ZREVRANK key member //获得指定元素从大到小的元素排名,排名从0开始