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