Redis介绍与安装,Redis普通连接和连接池,Redis之字符串类型
Redis介绍与安装
redis:非关系型数据库【存储数据的地方】
数据类型:5大数据类型:
字符串、列表、哈希(字典)、集合、有序集合
key-values形式存储
redis的特点---快
1.纯内存操作,避免了很多IO操作
2.高性能的网络模型:IO多路复用的epoll模型,承载着非常高的并发量
3.单线程架构,避免了线程间切换的消耗
6.x之前:单线程,单进程,没有线程间的切换,更少的消耗资源
6.x以后:多线程架构,数据操作还是使用单线程,别的线程做数据持久化,其他操作
redis应用场景(了解)
1 当缓存数据库使用,接口缓存,提高接口响应速度
请求进到视图---》去数据查询[多表查询,去硬盘取数据:速度慢]----》转成json格式字符串---》返回给前端
请求进到视图---》去redis[内存]----》取json格式字符串---》返回给前端
2 做计数器:单线程,不存在并发安全问题
统计网站访问量
个人站点浏览量
文章阅读量
3 去重操作:集合
4 排行榜:有序集合
阅读排行榜
游戏金币排行榜
5 布隆过滤器
6 抽奖
7 消息队列
redis VS mysql
redis: 内存数据库(读写快)、非关系型(操作数据方便、数据固定)
mysql: 硬盘数据库(数据持久化)、关系型(操作数据间关系、可以不同组合)
大量访问的临时数据,才有redis数据库更优
redis的安装
它是一款来源软件,使用C语言写的,是一种编译型语言,在操作系统运行,要编译成可执行文件,由于采用了IO多路复用的epoll模型,所以它不支持windows,只有linux操作系统支持epoll
1、官网下载:安装包或是绿色面安装
2、安装并配置环境变量
# 官网:https://redis.io/
-下载完是源代码:c语言源码 :https://redis.io/download/#redis-stack-downloads
-最稳定:6.x
-最新7.x
# 中文网:http://redis.cn/download.html
-上面最新只到5.x
# win版本下载地址
# 最新5.x版本 https://github.com/tporadowski/redis/releases/
# 最新3.x版本 https://github.com/microsoftarchive/redis/releases
下载完一路下一步即可,具体可参照:https://www.cnblogs.com/liuqingzheng/p/9831331.html
Redis操作
启动服务
启动服务,手动停止
客户端链接:redis-cli -h 127.0.0.1 -p 6379
简单命令:
set name lqz
get name
ping
停掉服务:
去win服务点关闭
客户端关闭:shutdown
redis的客户端图形化界面
-Redis Desktop Manager :开源的,原来免费,后来收费了 推荐用(mac,win,linux 都有)
-Qt5 qt是个平台,专门用来做图形化界面的
-可以使用c++写
-可以使用python写 pyqt5 使用python写图形化界面 (少量公司再用)
-resp-2022.1.0.0.exe 一路下一步,安装完启动起来
-Redis Client 小众
图形化界面,连接redis 输入地址和端口,点击连接即可
我们这里用RESP,做连接和展示
Redis普通连接和连接池
通常情况下, 当我们需要做redis操作时, 会创建一个连接, 并基于这个连接进行redis操作, 操作完成后, 释放连接,
一般情况下, 这是没问题的, 但当并发量比较高的时候, 频繁的连接创建和释放对性能会有较高的影响
于是, 连接池就发挥作用了
连接池的原理是, 通过预先创建多个连接, 当进行redis操作时, 直接获取已经创建的连接进行操作, 而且操作完成后, 不会释放, 用于后续的其他redis操作
这样就达到了避免频繁的redis连接创建和释放的目的, 从而提高性能了
1 普通连接
# 安装redis 模块:pip install redis
# 1 导入模块的Redis类
from redis import Redis
# 2 实例化得到对象
conn = Redis(host='127.0.0.1', port=6379)
# 3 使用conn,操作redis
# 获取name的值
# res = conn.get('name') # 返回数据是bytes格式
# 4 设置值
conn.set('age',19)
conn.close()
2 连接池连接
import redis
POOL = redis.ConnectionPool(max_connections=10, host='127.0.0.1', port=6379) # 创建一个大小为10的redis连接池
### 测试代码
import redis
from threading import Thread
from pool import POOL
def task():
# 做成模块后,导入,无论导入多少次,导入的都那一个POOL对象
conn = redis.Redis(connection_pool=POOL) # 报错的原因是拿连接,池里不够了,没有等待,线程报错 设置等待,参数
print(conn.get('name'))
for i in range(1000):
t = Thread(target=task) # 每次都是一个新的连接,会导致 的连接数过多
t.start()
Redis之字符串类型
redis 是key-value形式存储
redis 数据放在内存中,如果断电,数据丢失---》需要有持久化的方案
'''
1 set(name, value, ex=None, px=None, nx=False, xx=False)
2 setnx(name, value)
3 setex(name, value, time)
4 psetex(name, time_ms, value)
5 mset(*args, **kwargs)
6 get(name)
7 mget(keys, *args)
8 getset(name, value)
9 getrange(key, start, end)
10 setrange(name, offset, value)
11 setbit(name, offset, value)
12 getbit(name, offset)
13 bitcount(key, start=None, end=None)
14 bitop(operation, dest, *keys)
15 strlen(name)
16 incr(self, name, amount=1)
# incrby
17 incrbyfloat(self, name, amount=1.0)
18 decr(self, name, amount=1)
19 append(key, value)
'''
set操作
set(name, value, ex=None, px=None, nx=False, xx=False)
在Redis中设置值,默认,不存在则创建,存在则修改
参数:
ex:过期时间(秒)
px:过期时间(毫秒)
nx,如果设置为True,则只有name不存在时,当前set操作才执行,值存在,就修改不了,执行没效果
xx,如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在,不会设置新值
import redis
conn = redis.Redis()
res = conn.set('name','xin')
print(res)
ex 是过期时间,到4s过期,数据就没了
res = conn.set('password', '12345678', ex=4)
print(res)
px 是过期时间,到3s过期,数据就没了
res = conn.set('password', '12345678', px=3000)
print(res)
如果设置为True,则只有name不存在时,当前set操作才执行,值存在,就修改不了,执行没效果
conn.set('age', 30, nx=True)
print(res)
res = conn.set('age', 30, nx=False)
print(res)
如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在,不会设置新值
conn.set('age', 30, xx=True)
print(res)
res = conn.set('age', 30, xx=False)
print(res)
setnx(name, value) 就是:set nx=True
res = coon.setnx('hobby','sing')
print(res)
psetex(name, time_ms, value) 本质就是 set px设置时间
res = conn.psetex('name', 3000, 'zx')
print(res)
mset(*args, **kwargs) 传字典批量设置
res = conn.mset({'name': 'xxx', 'age': 19})
print(res)
get(name) 获取值,取到是bytes格式
import redis
conn = redis.Redis(decode_responses=True)
res = conn.get('name')
print(res)
mget(keys, *args) 批量获取
import redis
conn = redis.Redis(decode_responses=True)
res = conn.mget('name', 'age')
print(res)
getset(name, value) 先获取,再设置
import redis
conn = redis.Redis(decode_responses=True)
res = conn.getset('name', 'wei')
print(res)
getrange(key, start, end) 取的是字节,前闭后闭区间
res = conn.getrange('name',0,1)
print(res)
etrange(name, offset, value) 从某个起始位置开始替换字符串
res = conn.etrange('name',2,'1')
print(res)
setbit(name, offset, value)
res = conn.setbit('name',2,'1')
print(res)
getbit(name, offset)
res = conn.getbit('name',2,'1')
print(res)
bitcount(key, start=None, end=None)
print(conn.bitcount('name',0,2)) # 2指的是2个字符
strlen(name) 统计字节长度
print(conn.strlen('name'))
incr(self, name, amount=1) 计数器
res = conn.incr('age',amount=3)
incrbyfloat(self, name, amount=1.0)
res = conn.incrbyfloat('age', amount=1.0)
print(res)
decr(self, name, amount=1)
res = conn.decr('age', amount=1)
print(res)
append(key, value)
conn.append('name', 'nb')
标签:name,Redis,redis,print,conn,res,字符串,连接池
From: https://www.cnblogs.com/zx0524/p/17189829.html