近期在用redis做消息队列的分发,故而把近期了解到的redis用法稍作整理。
一、安装redis
linux系统中可以直接通过命令来安装redis,很方便。但是安装过程中会报错
No apport report written because the error message indicates its a followup error from a previous failure
报错的很大原因是系统禁用了ipv6,此时取消禁用ipv6即可。
vim /etc/sysctl.conf
#net.ipv6.conf.all.disable_ipv6 = 1 #注释这条。
net.ipv6.conf.eth0.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
#保存完毕,执行下面的命令使其生效。
sysctl -p
如果仍是报错,而且报错信息中出现dpkg,则可以参考链接中的方法进行解决。
二、命令操作redis
redis有5中数据结构,具体操作如下
1、命名规范
set test:test1 100
1、string
set key1 100
get key1
2、hash
# 单个操作
hset test:test2 name zhang
hset test:test2 age 14
hget test:test2 name
hget test:test2 age
hgetall test:test2
# 批操作
hmset test:test3 name li age 15
hgetall test:test3
3、list
# 左侧添加,存储顺序为 4、3、2、1
lpush test:test4 1 2 3 4
lrange test:test4 0 10 # 从0到10元素的查看
lpop test:test4 # 从左边取,删除最左边的元素
rpop test:test4 # 从右边取,删除最右边的元素
# 右侧添加,存储顺序为1、2、3、4
rpush test:test5 1 2 3 4
4、set(无序)
sadd test:test6 a b c d d # 向set里面添加元素,若添加的元素有重复则去除重复
smembers test:test6 # 打印set元素
srem test:test6 a # 删除set里面的a元素
5、zset(有序)
zadd test:test7 9 a 8 c 10 d 1 e # set有顺序,不能重复,适合做排行榜 9、8、10、1为score
zadd test:test8 9 f # 添加新的元素,只能是这种格式,9在前面,也就是score在前面,设置该score的值
zrange test:test7 0 -1 # 从小到大排序
zrevrange test:test7 0 -1 # 从大到小排序
zincrby test:test7 1 a # a元素的score加1
三、python操作redis
具体也可参考链接
import redis
from config.db import *
# 连接池
pool = redis.ConnectionPool(host=dbr_host, port=dbr_port, db=dbr_db, password=dbr_passwd, decode_responses=True)
r = redis.Redis(connection_pool=pool)
################################################### string ###################################################
# string,单独设置值
r.set("key1", "test")
print(r.get("key1"))
# string,批量设置值
key_dict = {}
key_list = ["key2", "key3"]
key_dict['key2'] = "v2"
key_dict['key3'] = "v3"
r.mset(key_dict)
list1 = r.mget(key_list)
print(list1)
# 切片
r.set("key4", "t4st")
print(r.getrange("key4", 0, 1))
# 替换元素的内容
r.setrange("key4", 1, "e")
print(r.get("key4"))
# 元素结尾添加新的内容
r.append("key4", "_add")
print(r.get("key4"))
################################################### hash ###################################################
# hash的添加查询
r.hset("hash1", "k1", "v1")
r.hset("hash1", "k2", "v2")
print(r.hkeys("hash1")) # 取hash中所有的key
print(r.hget("hash1", "k1")) # 单个 - 取hash的key对应的值
print(r.hmget("hash1", "k1", "k2")) # 多个 - 取hash的key对应的值
# hash批量操作
r.hmset("hash2", {"k2": "v2", "k3": "v3"})
print(r.hget("hash2", "k2")) # 单个 - 取出"hash2"的key-k2对应的value
print(r.hmget("hash2", ["k2", "k3"])) # 批量 - 取出"hash2"的key对应的value
# hash取出所有键值对
print(r.hgetall("hash2"), type(r.hgetall("hash2")))
# hash中键值对的个数
print(r.hlen("hash2"))
# hash中key的值
print(r.hkeys("hash2"))
# hash中value的值
print(r.hvals("hash2"))
# 判断元素是否存在于hash
print(r.hexists("hash2", "k4"))
print(r.hexists("hash2", "k3"))
# 删除键值对
r.hdel("hash2", "k3")
print(r.hgetall("hash2"))
################################################### list ###################################################
# list的增加
r.lpush("list1", 11, 22, 33) # 左侧添加,保存顺序为33 22 11
print(r.lrange('list1', 0, -1)) # 切片索引,-1即为list最后一个元素
# list的长度
print(r.llen("list1"))
# 往列表中左边第一个出现的元素"11"前插入元素"00"
r.linsert("list1", "before", "11", "00")
print(r.lrange('list1', 0, 10))
# 元素修改
r.lset("list1", 0, -11) # 把索引号是0的元素修改成-11
print(r.lrange('list1', 0, 10))
# 元素删除
r.lrem("list1", "11", 1) # 将列表中左边第一次出现的"11"删除
print(r.lrange('list1', 0, -1))
r.lrem("list1", "99", -1) # 将列表中右边第一次出现的"99"删除
print(r.lrange('list1', 0, -1))
r.lrem("list1", "22", 0) # 将列表中所有的"22"删除
print(r.lrange('list1', 0, -1))
# 删除索引之外的所有值
r.ltrim("list1", 0, 2)
print(r.lrange('list1', 0, -1))
# 取值
print(r.lindex("list1", 0)) # 取出索引号是0的值
################################################### set ###################################################
# set增加
r.sadd("set1", 33, 44, 55, 66, 66) # 往集合里面添加元素,无序的,如果添加的元素里面有重复的,则会去重
# set长度
print(r.scard("set1"))
# 打印set
print(r.smembers("set1"))
# 差集
r.sadd("set2", 11, 22, 33)
print(r.sdiff("set1", "set2")) # 在集合set1但是不在集合set2中
print(r.sdiff("set2", "set1")) # 在集合set2但是不在集合set1中
# 将差集固化到新的存储空间
r.sdiffstore("set3", "set1", "set2") # 将在集合set1但是不在集合set2中的元素,固化到set3集合中
print(r.smembers("set3"))
# 交集
print(r.sinter("set1", "set2")) # 取2个集合的交集
# 将交集固化到新的存储空间
print(r.sinterstore("set3", "set1", "set2")) # 将2个集合的交集,固化到set3集合中
# 并集
print(r.sunion("set1", "set2")) # 取2个集合的并集
# 将并集固化到新的存储空间
print(r.sunionstore("set3", "set1", "set2")) # 将2个集合的并集,固化到set3集合中
# 判断元素是否在集合中
print(r.sismember("set1", 33)) # 33是集合的成员
# 删除 -- 随机删除并且返回被删除值
print(r.spop("set1")) # 随记删除set1集合中的一个值,这个删除的值是随机删除的,集合是无序的
print(r.smembers("set1"))
# 删除 -- 指定值删除
print(r.srem("set1", 11)) # 从集合中删除指定值 11
print(r.smembers("set1"))
四、redis队列
生产者
import sys
import json
import time
import redis
import datetime
import multiprocessing
from config.db import *
from datetime import date
if __name__ == "__main__":
redisPool = redis.ConnectionPool(host=dbr_host, port=dbr_port, db=dbr_db, password=dbr_passwd, decode_responses=True)
client = redis.Redis(connection_pool=redisPool)
for k in range(10):
seaweed = {
"label":k,
'timd':20160503,
'timm':20170430
}
json_cmd = json.dumps(seaweed, ensure_ascii=False)
client.rpush(dbr_gifshow_live_queue, json_cmd)
print(time.asctime(time.localtime(time.time())))
# time.sleep(5)
消费者
import sys
import json
import time
import redis
import datetime
import multiprocessing
from config.db import *
from datetime import date
if __name__ == "__main__":
redisPool = redis.ConnectionPool(host=dbr_host, port=dbr_port, db=dbr_db, password=dbr_passwd, decode_responses=True)
client = redis.Redis(connection_pool=redisPool)
client = redis.Redis(connection_pool=redisPool)
count = 0
while True:
if client.llen(dbr_gifshow_live_queue) == 0:
print("--------", count)
count = 0
try:
task = client.blpop(dbr_gifshow_live_queue, 0) # 队列为阻塞队列,必须添加参数0,当redis中没有元素时,程序会一直等待直到redis中出现元素
task = json.loads(task[1])
count += 1
print(count, task["label"], task['timd'], task['timm'])
except:
continue
time.sleep(1)
具体也可参考链接