redis学习

近期在用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)

    具体也可参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
尚硅谷是一个教育机构,他们提供了一份关于Redis学习笔记。根据提供的引用内容,我们可以了解到他们提到了一些关于Redis配置和使用的内容。 首先,在引用中提到了通过执行命令"vi /redis-6.2.6/redis.conf"来编辑Redis配置文件。这个命令可以让你进入只读模式来查询"daemonize"配置项的位置。 在引用中提到了Redis会根据键值计算出应该送往的插槽,并且如果不是该客户端对应服务器的插槽,Redis会报错并告知应该前往的Redis实例的地址和端口。 在引用中提到了通过修改Redis的配置文件来指定Redis的日志文件位置。可以使用命令"sudo vim /etc/redis.conf"来编辑Redis的配置文件,并且在文件中指定日志文件的位置。 通过这些引用内容,我们可以得出结论,尚硅谷的Redis学习笔记涵盖了关于Redis的配置和使用的内容,并提供了一些相关的命令和操作示例。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Redis学习笔记--尚硅谷](https://blog.csdn.net/HHCS231/article/details/123637379)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Redis学习笔记——尚硅谷](https://blog.csdn.net/qq_48092631/article/details/129662119)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值