首页 > 数据库 >Redis介绍与安装,Redis普通连接和连接池,Redis之字符串类型

Redis介绍与安装,Redis普通连接和连接池,Redis之字符串类型

时间:2023-03-07 21:57:04浏览次数:38  
标签:name Redis redis print conn res 字符串 连接池

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

image

image

redis的客户端图形化界面

-Redis Desktop Manager :开源的,原来免费,后来收费了  推荐用(mac,win,linux 都有)
-Qt5  qt是个平台,专门用来做图形化界面的 
            -可以使用c++写
            -可以使用python写  pyqt5  使用python写图形化界面 (少量公司再用)
            -resp-2022.1.0.0.exe 一路下一步,安装完启动起来
-Redis Client  小众
        
    	图形化界面,连接redis 输入地址和端口,点击连接即可
我们这里用RESP,做连接和展示

image

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)

image

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)

image

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)

image

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

相关文章