redis介绍和安装,redis普通链接和连接池,redis字符串类型,redis hash类型

发布时间 2023-06-27 21:07:30作者: 无敌大帅逼

1 Redis介绍和安装

# Redis :软件,存储数据的,速度非常快,redis是一个key-value存储系统(没有表的概念),cs架构的软件
	-服务端  客户端(python作为客户端,java,go,图形化界面,命令窗口的命令)
# es:存数据的地方

# 关系型数据库和非关系型数据库
	-关系型:mysql,PostgreSQL,oracle,sqlserver,db2
    	-PG
        -去 IOE:国产化
        	-IBM---》浪潮信息,曙光,联想
            -Oracle---》数据----》达梦。。。。
            -EMC存储--》国产存储
    -非关系型数据库(nosql):redis(缓存),mongodb(json文档数据存储),es(大数据量存储)。。。。
    	-nosql 指非关系型数据库: no only sql,对关系型数据库的补充
        
# redis特点:
	-开源软件,存数据,cs架构
    -key-value存储 ,5大数据类型  value的类型是5种:字符串,hash(字典),列表,集合,有序集合
    -速度快:
    	-1 纯内存存储(核心)
        -2 使用了IO多路复用的网络模型
        -3 数据操作是单线程,避免了线程间切换,而且没有锁,也不会数据错乱
    -支持持久化
    	-纯内存,可以存到硬盘上,防止数据丢失
    -redis又被称之为 缓存数据库

1.1 安装redis

# redis 是用c语言编写的,需要在不同平台编译成可执行文件,才能在这个平台上运行
	-redis 使用了io多路复用种的epoll模型,win不支持epoll
    -redis官方,不支持win版本
    -微软官方,就把redis改动,编译成可执行,能运行在win上,滞后 3.x版本
    -第三方:5.x版本
    
# redis 官方网:https://redis.io/download/
# redis中文网:http://redis.cn
# win:3.x:https://github.com/microsoftarchive/redis/releases
# win:5.x:https://github.com/tporadowski/redis/releases/


# 安装:一路下一步
	-安装完成后,在安装路径下有
    	-redis-cli.exe     # mysql
        -redis-server.exe   # mysqld
        -redis.windows-service.conf  # my.ini
     -并且会自动做成服务
    	-服务的命令:redis-server.exe  redis.windows-service.conf
        
        
        
        
# 启动redis服务端
	-1 命令行中  redis 就可以启动服务
    -2 命令行中,启动服务,并指定配置文件
    	redis-server 配置文件路径
    -3 使用服务启动

# 客户端链接
	-1 命令行客户端:
    	-redis-cli  # 默认连本地的6379端口
        -redis-cli -p 6379 -h 127.0.0.1
    -2 图形化客户端链接
    	-1 最新版的Navicate支持链接redis了(收费的)
        -2 Redis Desktop Manager(https://resp.app/)  收费的  用的多  qt写图形化界面
        	-qt是个平台,做GUI[图形化界面]开发
            -用c写,用python写  pyqt5
            
    -3 python的模块
    	-pip install redis
        

2 redis普通链接和连接池

2.1 普通链接

from redis import Redis

# conn = Redis()  # 建立redis的链接
conn = Redis(host="127.0.0.1",
             port=6379,
             db=0,decode_responses=True)  # 建立redis的链接   decode_responses=True,查询回来返回的结果是字符串类型,否则是byte格式
res = conn.get('name')  # 获取key名为name的value值
print(res)
conn.close()  # 关闭链接

2.2 连接池链接

# 一定要保证,池是单例的,以模块导入的形式做成了单例,是python独有的,所有线程共用一个连接池,而不是每个线程独有一个

# pool.py
import redis
POOL = redis.ConnectionPool(max_connections=1000,host='127.0.0.1',port=6379)

# 其它.py

import redis
from pool import POOL # 模块导入的方式, 天然单例
conn = redis.Redis(connection_pool=POOL)  # 以后拿到链接,是从POOL种取,如果没有可用的了,默认不阻塞,可以通过某个参数配置,设置阻塞等待
res = conn.get('name')  # 获取key名为name的value值
print(res)
conn.close()  # 关闭链接

image

3 redis字符串类型

# https://www.cnblogs.com/liuqingzheng/articles/9833534.html

'''
1 set(name, value, ex=None, px=None, nx=False, xx=False)
2 setnx(name, value)
3 psetex(name, time_ms, value)
4 mset(*args, **kwargs)
5 get(name)
6 mget(keys, *args)
7 getset(name, value)
8 getrange(key, start, end)
9 setrange(name, offset, value)
10 setbit(name, offset, value)
11 getbit(name, offset)
12 bitcount(key, start=None, end=None)
13 bitop(operation, dest, *keys)
14 strlen(name)
15 incr(self, name, amount=1)
16 incrbyfloat(self, name, amount=1.0)
17 decr(self, name, amount=1)
18 append(key, value)
'''

import redis

conn = redis.Redis()
1 set(name, value, ex=None, px=None, nx=False, xx=False)
# ex,过期时间(秒)
# px,过期时间(毫秒)
# nx,如果设置为True,name不存在则添加,存在无效果
# xx,如果设置为True,name存在则修改,不存在无效果
 conn.set('hobby', '篮球', ex=6)
 conn.set('hobby', '篮球', px=3000)
 conn.set('hobby', '足球', nx=True)
 conn.set('hobby', '足球', xx=True)

 2 setnx(name, value)
 conn.setnx('hobby1', '乒乓球')  
    # 等同于conn.set('hobby', '足球', nx=True)

 3 psetex(name, time_ms, value)
 conn.psetex('name',3000,'xxx')  #px
    
    setex(name, value, time)
  conn.psetex('name',3000,'xxx')    #ex

 4 mset(*args, **kwargs)
 conn.mset({'name': "lqz", 'height': 183})  
    # 一次性设置多个键值对,跟一次次设置的区别是,少了网络交互的时间

 5 get(name)
 res=conn.get('hobby')  
    # utf-8 编码,一个中文占3个字节    GBK 编码,一个中文占2个字节
# print(res)


 6 mget(keys, *args)
 res=conn.mget('name','age')  #批量取值
 res=conn.mget(['name','age'])
 print(res) 

 7 getset(name, value)
 res=conn.getset('name','彭于晏')
 print(res)
    
 8 getrange(key, start, end)
 res=conn.getrange('name',0,1)  # 前闭后闭区间,拿的是字节,不是字符
 print(res)

 9 setrange(name, offset, value)
 conn.setrange('name',2,'lqz')

 14 strlen(name)
 res=conn.strlen('name')  # 9 统计字节长度
 print(res)


 15 incr(self, name, amount=1)  # 做计数器。不会出现并非安全问题,每一次执行默认加1
 conn.incrby('height')

 16 incrbyfloat(self, name, amount=1.0)

 17 decrby(self, name, amount=1)
 conn.decrby('height',5) #减5


 18 append(key, value)
conn.append('name', 'xxxx')  #末尾添加

conn.close()


'''
get
set
strlen
append
'''

4 redis hash类型

# hash类型就是咱们python中的字典,key-value,字典又叫hash类型   字典的key必须可hash
	-字典类型在底层存储,基于数组存的
	key---{key:value,key:value}
    
conn = redis.Redis(decode_responses=True)
1 hset(name, key, value)
conn.hset('userinfo', 'name', '刘亦菲')
conn.hset('userinfo', 'age', '38')

2 hmset(name, mapping) # 弃用了,还能用
conn.hmset('userinfo2', {'name': "彭于晏", 'height': 183})
#批量添加
conn.hset('userinfo3', mapping={'name': "彭于晏123", 'height': 183})

3 hget(name,key)
res=conn.hget('userinfo','age')
print(res)

4 hmget(name, keys, *args)
res=conn.hmget('userinfo',['name','age'])
print(res)

5 hgetall(name)  # 慎用,如果hash中key非常的,可能会撑爆内存
#字典形式获取所有
res=conn.hgetall('userinfo')
print(res)

6 hlen(name)
#获取字段的个数
res=conn.hlen('userinfo')
print(res)
7 hkeys(name)
#获取所有key值
print(conn.hkeys('userinfo'))
8 hvals(name)
#获取所有value值
print(conn.hvals('userinfo'))
9 hexists(name, key)
#查看该key是否存在
print(conn.hexists('userinfo','name'))

10 hdel(name,*keys)
#删除键里面对应key的键值对
conn.hdel('userinfo2', 'name', 'height')


11 hincrby(name, key, amount=1)
#默认加1
conn.hincrby('userinfo3','height')
12 hincrbyfloat(name, key, amount=1.0)

13 他们是一家  #批量添加
for i in range(1000):
    conn.hset('hash_test', 'egg_%s' % i, '鸡蛋%s号' % i)


14 res=conn.hgetall('hash_test')
print(res)
15 hscan(name, cursor=0, match=None, count=None)  分批获取,获取多少个,约等于,它不单独用
res = conn.hscan('hash_test', cursor=0, count=20)
print(len(res[1]))

16 hscan_iter(name, match=None, count=None)  # 获取所有,但是分批获取
res=conn.hscan_iter('hash_test',count=10)  # 取出所有,每次拿10条,用完再取10条,直到取完,内部使用了hscan+生成器
for item in res:
    print(item)    
    

conn.close()    
'''
hset
hget
hlen
hexisit

'''