python连接redis、redis字符串操作、hash操作、列表操作、其他通用操作、管道、django中使用redis

今日内容概要

python连接redis

redis字符串操作

redis之hash操作

redis之列表操作

redis其他 通用操作,管道

django中使用redis

内容详细

1、python连接redis

# 安装模块:

 pip install redis

 

# django中有没有连接池?

 没有,django中一个请求就会创建一个mysql连接,django并发量不高,mysql能撑住

 想在django中使用连接池,有第三方:

  https://www.cnblogs.com/wangruixing/p/13030755.html

            

            

# python实现单例的5种方式

 http://liuqingzheng.top/python/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E9%98%B6/19-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E9%AB%98%E7%BA%A7%E5%AE%9E%E6%88%98%E4%B9%8B%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/

from redis import Redis

 

# 1 普通连接

conn = Redis(host="localhost", port=6379, db=0, password=None)

conn.set('name', "lqz") # 创建值

res = conn.get('name')

print(res) # b'lqz'

 

 

# 2 连接池连接(以模块导入的方式实现单例)

 创建文件redis_pool.py:

import redis

 

# 第一步:先要构造一个池

# POOL必须是单例的,全局只有一个实例,无论程序怎么执行,POOL是同一个对象

POOL = redis.ConnectionPool(max_connections=10, host="localhost", port=6379)

 

--------------------------------------------------------------------------------------------------------------

 

import redis

from redis_pool import POOL

 

# 第二步:从池中拿一个连接

conn = redis.Redis(connection_pool=POOL)

print(conn.get('name'))

 

 

# 3 多线程演示

from threading import Thread

import redis

 

import time

from redis_pool import POOL # 真报错吗?不会报错,

 

 

def get_name():

    conn = redis.Redis(connection_pool=POOL)

    print(conn.get('name'))

 

 

for i in range(10):

    t = Thread(target=get_name)

    t.start()

 

time.sleep(2)

 

'''

1 咱们这个py作为脚本运行,不能使用相对导入

2 只能使用绝对导入

3 从环境变量中开始到导起

4 在pycharm中右键运行的脚本所在的目录,就会被加入到环境变量

'''

2、redis字符串操作

# 各种锁知识:https://zhuanlan.zhihu.com/p/489305763

 

'''

1 set(name, value, ex=None, px=None, nx=False, xx=False)

     ex,过期时间(秒)

     px,过期时间(毫秒)

     nx,如果设置为True,则只有name不存在时,当前set操作才执行,值存在,就修改不了,执行没效果

     xx,如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在,不会设置新值

 

2 setnx(name, value)

2 setex(name, value, time)

3 psetex(name, time_ms, value)

4 mset(*args, **kwargs)

5 get(name)

5 mget(keys, *args)

 

6 getset(name, value)

 

7 getrange(key, start, end)

 

8 setrange(name, offset, value)

 

9 setbit(name, offset, value)

 

10 getbit(name, offset)

 

11 bitcount(key, start=None, end=None)

 

 

12 bitop(operation, dest, *keys)

 

13 strlen(name)

 

14 incr(self, name, amount=1)

 

15 incrbyfloat(self, name, amount=1.0)

 

16 decr(self, name, amount=1)

 

17 append(key, value)

 

'''

 

import redis

 

conn = redis.Redis()

 

# 1 set(name, value, ex=None, px=None, nx=False, xx=False)

conn.set('age', 19)

 

"""

ex,过期时间(秒)---->过期时间

conn.set('age', 19, ex=3)

px,过期时间(毫秒) ---->过期时间

 

nx,如果设置为True,则只有name不存在时,当前set操作才执行, 值存在,就修改不了,执行没效果

conn.set('wife','dlrb',nx=True)

 

xx,如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在,不会设置新值

conn.set('wife','dlrb',xx=True)

"""

# 2 setnx(name, value)--->等同于conn.set('wife','dlrb',nx=True)

# 2 setex(name, value, time)--->conn.set('wife','lyf',ex=3)

 

# 3 psetex(name, time_ms, value)--->conn.set('wife','lyf', px=3)

 

 

# 4 mset(*args, **kwargs)--》批量设置

# conn.mset({'name1': 'pyy', 'age1': 20})

 

# 5 get(name) 拿单个值

print(conn.get('age1'))

 

# 5 mget(keys, *args) 拿多个值

print(conn.mget(['age1', 'age']))

print(conn.mget('name', 'age', 'age1'))

 

# 6 getset(name, value)

print(conn.getset('name', 'dsb')) # 获取值之后更改值

 

# 7 getrange(key, start, end)

print(conn.getrange('name', 0, 1)) # 取字节 ,前闭后闭

 

# 8 setrange(name, offset, value) 从指定位置开始更改

conn.setrange('name', 1, 'qqq') # dsb--->dqqq

 

# 9 setbit(name, offset, value) ---》后面再聊---》独立用户统计---》用户量过亿---》日活

conn.setbit('name', 1, 0) # 改的是比特位,d 一个byte占8个比特位--》2进制---》10进制---》字符

 

# 10 getbit(name, offset)

print(conn.getbit('name', 1))

 

# 11 bitcount(key, start=None, end=None) 统计多少比特位

print(conn.bitcount('name', 0, 1)) # 数字指的是字节,不是比特位

 

# 12 strlen(name) 统计字符长度

# 字节(一个byte)和字符(中 ? a 都是一个字符)

# 面试题:mysql中utf8和utf8mb4有什么区别?

# utf8---》不是咱们所知的utf-8,而是 mysql自己的,两个字节表示一个字符---》生僻字,表情存不了

# utf8mb4--》等同于常识的utf-8,最多4个字节表示一个字符---》存表情,存生僻字都可以

print(conn.strlen('name')) # 字节--》9--》gbk编码一个中文占2个字节 # utf-8编码 大部分一个中文占3个字节,生僻字可能占4

 

# 13 incr(self, name, amount=1)--->做计数器--》记录博客访问量--》博客表的文章上加个访问量字段,一旦有一个人访问,数字+1

conn.incr('age') # 不存在并发安全的问题---》redis6.0之前是单线程架构,并发访问操作,实际只排着队一个个来

 

# 14 incrbyfloat(self, name, amount=1.0)

 

# 15 decr(self, name, amount=1) 减值

conn.decr('age')

 

# 16 append(key, value) 增加值

conn.append('name', 'nb')

 

# 记住:get set strlen

3、redis之hash操作

'''

1 hset(name, key, value)

2 hmset(name, mapping)

3 hget(name,key)

4 hmget(name, keys, *args)

5 hgetall(name)

6 hlen(name)

7 hkeys(name)

8 hvals(name)

9 hexists(name, key)

10 hdel(name,*keys)

11 hincrby(name, key, amount=1)

12 hincrbyfloat(name, key, amount=1.0)

13 hscan(name, cursor=0, match=None, count=None)

14 hscan_iter(name, match=None, count=None)

'''

import redis

 

conn = redis.Redis()

 

# 1 hset(name, key, value) 设置值

conn.hset("userinfo", 'name', '彭于晏')

conn.hset("userinfo_01", mapping={'name': "刘亦菲", 'age': 18})

 

# 2 hmset(name, mapping)---》弃用了-->直接使用hset即可

# conn.hmset("userinfo_02", mapping={'name': "刘亦菲", 'age': 18})

 

# 3 hget(name,key) 获取值

print(str(conn.hget('userinfo_01', 'name'), encoding='utf-8'))

print(str(conn.hget('userinfo_01', 'age'), encoding

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值