logo头像

一路过来,不过游牧自己。。

Redis小趣(二)


上一篇讲的主要是关于字符串的值得一个操作命令,其中还有好多零散的知识点,慢慢再补充!

(设置多少秒或者毫秒后过期)
EXPIRE key seconds
PEXPIRE key milli
seconds
设置在指定的Unix时间戳过期
EXPIREAT key timestamp(例如每天的日排行)
PEXPIREAT key milliontimestamp-timestamp

删除过期
PERSIST key

查看剩余的生存时间:
TTL key
PTTL key
key 存在但没有设置TTL 返回-1
key存在 但还在生存期内,返回剩余的秒或者毫秒
key曾经存在,但已经消亡,返回-2

查找键:
KEYS pattern
pattern 取值:
*任意长度字符
?任意一个字符
[]字符集合,表示可以是集合中的任意一个

键类型:
TYPE key

键是否存在:
EXISTS key

键重命名:
RENAME key newkey
RENAMENX key newkey(不存在,就重命名)

删除键:
DEL key[key…]

##一、位图:bitmap
位图不是真正的数据类型,他是定义在字符串类型中的
一个字符串类型的值最多能存储512M字节的内容
位上限:2^(9+10+10+3)=2^32b

设置某一位上的值
SETBIT key offset value
offset 偏移量,从0开始(注意这里默认从右开始)
value不写,默认是0

获取某一位上的值
GETBIT key offset

返回指定0或者1在指定区间上第一次出现的位置
BITPOS key bit[start][end]

位操作:
operation 可以是AND,OR,NOT,XOR这四种操作中的一种
BITOP AND[OR,XOR(异或)] destkey key [key …]对一个或者多个key求逻辑与。或,异或操作,最后结果存储到destkey中
BITOP NOT destkey key除了not以外,其他都可以接受一个或多个输入
当BITOP 处理不同长的字符串时,较短缺少的那部分会被看作0
空的key被看作是全0的字符串

统计指定位置区间值为1的个数
BITCOUNT key [start][end]
这个字符串长:BITCOUNT key 0 -1——-与BITCOUNT key相等
BITCOUNT key 0 0 表示第0位

python演示位操作:

1
2
3
4
5
6
print bin(int(r.get(0b0011)))
print 'bitmap'
print r.bitcount('3')//结果是8?因为和上面结合,3是键,统计的是位数!!!!不是1的个数


r.bitop('OR','key1','key2','key3')

utf-8存储中文是用三个字节,GBK用的是两个字节

登陆不同的库
redis-cli –help
redis-cli -n 2

清楚当前库数据
FLUSHDB

清除库中所有数据
FLUSHALL

位图bitmap操作小例子:
1、网站用户的上线次数统计(活跃用户)
用户ID为key,天为offset,上线置为1
ID为500的用户,今年的第一台你上线,第30天上线
SETBIT u500 1 1
SETBIT u500 30 1
BITCOUNT U500
key u*

2、按天来统计网站活跃用户
天作为key 用户作为offset,上线置为1
求一天时间内活跃用户数
SETBIT 20160602 15 1
SETBIT 20160601 123 1
SETBIT 20160603 123 1
求6月1到6月3的活跃用户
BITOP OR 20160601 20160602 20160603(只要出现了1,就是上线活跃的)
BITCOUNT 20160601-3

代码示例:

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
r.setbit(“u1”,11)
r.setbit(“u1”,301)
r.setbit("u2",110,1)
r.setbit("u2",300,1)
for i in range(3,365,3)//从3-3653相隔
r.setbit("u101",i,1)

for i in range(4,365,2)
r.setbit("u105",i,1)

userlist=r.keys("u*")
print userlist

au=[]
Nau=[]
for u in userlist:
loginCount=r.bitcount(u)
if loginCount>100:
au.append((u,loginCount))
else
Nau.append((u,loginCount))

for l in au:
print l[0]+'is a Active User'+Str(l[1])
print "__________________________________"
for l in Nau:
print l[0]+'is a not Active User'+Str(l[1])

二、Redis_列表——Hash散列操作

List列表
(1)基于LinkList实现
(2)元素是字符串类型
(3)列表头尾增删快,中间增删慢,增删元素是常态
(4)元素可以出现重复元素
(5)最多包含2^32-1元素

列表的索引:
从左至右,从0开始
从右至左,从-1开始

命令:
B—block块,阻塞
L—Left 左
R—Right 右
X—-exist 存在

左右或者头尾压入栈
LPUSH key value[value…]
LPUSHX key value
RPUSH key value[value…]
RPUSHX key value

左右或者头尾弹出元素
LPOP key
RPOP key

从一个列表尾部弹出元素押入到另一个列表的头部
RPOP LPUSH source destination

返回列表中指定范围的元素
LRANGE key start stop
LRANGE key 0 -1表示返回所有元素
获取指定位置的元素
LINDEX key index

设置指定位置元素的值
LSET key index value

列表长度,元素个数
LLEN key

从列表头部开始删除值等于value元素count次
LREM key count value
count>0:从左往右搜索,移除与value值相等的元素,数量为count
count<0:从右往左搜索,移除与value相等的元素,次数为count绝对值
count=0:移除表中所有与value值相等的值

去除指定范围外的元素
LTRIM key start stop
举例:微博的评论最后500条
LTRIM u123::forumid:comments 0 499(相当于可以获得一个分页的数据)
本身list里面内容不变,不会删除

在列表中存在的值前或后插入元素
LINSERT key before|after pivot value
key和pivot不存在,不进行任何操作。
例:RPUSH lst Clojure C LUA
LINSERT lst AFTER c Python

阻塞:如果弹出的列表不存在或者为空,就会阻塞
超时时间设置为0,就是永久阻塞,直到有数据产生
如果多个客户端阻塞在同一列表上,就先到先服务
左右或者头尾阻塞弹出元素:
BLPOP key [key……] timeout
BRPOP key [key……] timeout

从列表尾部阻塞弹出元素压入到另一个列表的头部
BRPOPLPUSH source destination timeout
举例:你的微博,有粉丝,所有粉丝监控阻塞在关注你的列表里,然后你一发微博,就会发到其他关注人手里,先到先得

多走路,多思考,越努力,越幸运!
———————————————YoungerFary

微信打赏

赞赏是不耍流氓的鼓励