1.redis的简介
redis是开源的(BSD协议),使用ANSI C编写,基于内存的且持久化,高性能的key-value的NoSQL数据库
支持数据结构类型丰富,有如字符串(String),散列(hashes),列表(lists),集合(sets),有序集合(sorted sets)与范围查询,bitmaps,hyperloglogs和地理空间(geospatial)索引半径查询。
用途:缓存(StackOverFlow),数据库(微博),消息中间件(微博)
2.键key
(1)Redis key值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如“foo”的简单的字符串到一个JPG文件的内容都可以。空字符串也是有效key值
(2)key取值原则:
键值不需要太长,消耗内存,且在数据中查找这类键值的计算成本较高
键值不宜过短,可读性较差。
3.命令:
(1)设置字符串值
set key value [EX seconds] [PX millisenconds][NX|XX]
EX设置过期时间,秒,等同于setex key seconds value
PX设置过期时间,毫秒,等同于pesetex key milliseconds value
NX键不存在,才能设置,等同于setnx key value
XX键存在,才能设置
设置多个键的字符串值
mset key value [key value ...]
键不存在时,设置字符串值
msetnx key value [key value ...]
注意:这是原子操作。
例子:
set s1 abc
set s2 12
set s1 ABC XX
set se abc ex 15
mset s3 3 s4 4 s5 5
msetnx s5 A5 s6 6
(2)过期
redis可以给key设置一个生存时间(秒或者毫秒),当达到这个时长后,这些键值将会被自动删除
设置多少秒或者毫秒后过期
EXPIRE key seconds
PEXPIRE key milliseconds
设置在指定Unix时间戳过期
EXPIREAT key timestamp
PEXPIREAT key milliseconds-timestamp
删除过期
PERSIST key
(3)生存时间
Time To Live,key的剩余生存时间
查看剩余生存时间
TTL key
PTTL key
key存在但没有设置TTL,返回-1
key存在,但还在生存期内,返回剩余的秒或者毫秒
key曾经存在,但已经消亡,返回-2(2.8版本之前返回-1)
例子:
set se abc ex 15
ttl s6
expire s6 60
pttl s6
persist s6
pttl s6
EXPIREAT cache 1355292000
PEXPIREAT mykey 1555555555005
(4)查找键
keys pattern
pattern取值:
*任意长度字符
?任意一个字符
[]字符集合,表示可以是集合中的任意一个
例子:
keys s*
keys s?
keys s[13]
keys *
keys ??
(5)键类型
TYPE key
(6)键是否存在
EXISTS key
(7)键重命名
RENAME key newkey
RENAMENX key newkey
(8)键删除
DEL key [key ...]
(9)获取值
get key
获取多个给定的键的值
mget key [key ...]
返回旧值并设置新值
getset key value
如果键的不存在,就创建并赋值
字符串长度
strlen key
(10)追加字符串
append key value
如果键存在就追加,如果不存在就等同于set key value
获取子字符串
getrange key start end
索引值从0开始,负数表示字符串右边向左边数起,-1表示最右一个字符
覆盖字符
setrange key offset value
例子:
APPEND s6 123
getrange s1 1 2
getrange s1 0 -1
getrange s1 -2 -1
getrange s1 0 10000
SETRANGE s6 3 e
SETRANGE s6 3 efghijk
SETRANGE newkey 5 hello
SETRANGE s6 3 efghijk
(11)步长1的增减
INCR key
DECR key
字符串值会被解释成64位有符号的十进制整数来操作,结果依然转成字符串
步长增减
INCRBY key decrement
DECR key decrement
字符串值会被解释成64位有符号的十进制整数来操作,结果依然转成字符串。
4.位图bitmap
位图不是真正的数据类型,它是定义在字符串类型中
一个字符串类型的值最多能存储512字节的内容
位上限:2^(9+10+10+3)=2^32b
(1)设置某一位上的值
SETBIt key offset value
offset偏移量,从0开始
value不写,默认是0
(2)获取某一位上的值
getbit key offset
(3)返回指定值0或者1在指定区间上第一次出现的位置
bitpos keys bit [start][end]
例子:
set str1 ab
setbit str1 6 1
setbit str1 7 0
get str1
5.位操作:
对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 dteskey 上
operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种
BITOP AND destkey key [key ...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey
BITOP OR destkey key [key ...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey
BITOP XOR destkey key [key ...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey
BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey
除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入
当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0
空的 key 也被看作是包含 0 的字符串序列
6.统计指定位区间上值为1的个数
BITCOUNT key [start][end]
从左向右从0开始,从右向左从-1开始,注意官方start、end是为,测试后是字节
BITCOUNT testkey 0 0表示从索引为0个字节到索引为0个字节,就是第一个字节的统计
BITCOUNT testkey 0 -1等同于BITCOUNT testkey
最常用的就是BITCOUNT testkey
7.其他命令:
登录不同的库
redis-cli --help
redis-cli -n 2
清除当前库数据
FLUSHDB
清楚所有库中的数据
FLUSHALL
8.案例:
(1)网站用户的上线次数统计(活跃用户) ,用户ID作为key,天作为offset,上线置为1
ID为500的用户,今年的第一天上线,第30天上线
setbit u500 1 1
setbit u500 30 1
bitcount u500
keys u*
(2)按天统计网站活跃用户,天作为key,用户ID作为offset,上线置为1
求一段时间内活跃用户数
setbit 20160602 15 1
sebit 20160601 123 1
setbit 20160606 123 1
求6月1日到6月10日的活跃用户
bitop or 20160601-10 20160601 20160602 20160603 20160610
bitcount 20160601-10
结果为2