redis

redis介绍

redis:非关系型数据库【存数据的地方】nosql数据库,内存存储,速度非常快,可以持久化【数据从内存同步到硬盘】

数据类型:【5大数据类型:字符串,列表,哈希(字典),集合,有序集合】,key-value形式存储【根本没有表的结构,相当于咱们的字典】

redis的特点--快

1.高性能的网络模型:IO多路复用的epoll模型,承载着非常高的并发量

2.纯内存操作,避免了很多IO操作

3.单线程架构,避免了线程间切换的消耗
    6.x之前:单线程,单进程
    6.x以后:多线程架构,数据操作还是使用单线程,别的线程做数据持久化,其他操作

redis应用场景(了解)

1 当缓存数据库使用,接口缓存,提高接口响应速度
    请求进到视图---》去数据查询[多表查询,去硬盘取数据:速度慢]----》转成json格式字符串---》返回给前端
    请求进到视图---》去redis[内存]----》取json格式字符串---》返回给前端

2 做计数器:单线程,不存在并发安全问题
    统计网站访问量
    个人站点浏览量
    文章阅读量

3 去重操作:集合

4 排行榜:有序集合
    阅读排行榜
    游戏金币排行榜

5 布隆过滤器

6 抽奖

7 消息队列

redis的安装

它是一款来源软件,使用C语言写的,是一种编译型语言,在操作系统运行,要编译成可执行文件,由于采用了IO多路复用的epoll模型,所以它不支持windows,只有linux操作系统支持epoll

# 微软官方:改了,编译成可执行的安装包,下载一路下一步安装
    -版本没有最新

# 官网: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

检测是否装好

win装完会有redis服务

启动服务,手动停止
客户端链接:redis-cli -h 127.0.0.1 -p 6379
简单命令:
    set name lqz
    get name
    ping

停掉服务:
    去win服务点关闭
    客户端关闭:shutdown

image

python 操作redis

# pip3 install redis

from redis import Redis

conn=Redis( host="localhost",port=6379)
# conn.set('name','xxx')
print(conn.get('name'))
conn.close()

image

redis连接池

通常情况下, 当我们需要做redis操作时, 会创建一个连接, 并基于这个连接进行redis操作, 操作完成后, 释放连接,

一般情况下, 这是没问题的, 但当并发量比较高的时候, 频繁的连接创建和释放对性能会有较高的影响

于是, 连接池就发挥作用了

连接池的原理是, 通过预先创建多个连接, 当进行redis操作时, 直接获取已经创建的连接进行操作, 而且操作完成后, 不会释放, 用于后续的其他redis操作

这样就达到了避免频繁的redis连接创建和释放的目的, 从而提高性能了

直接连接

直接链接
def get_name_from_redis():
    conn = Redis(host="localhost", port=6379)
    print(conn.get('name'))
    conn.close()


for i in range(100):
    t=Thread(target=get_name_from_redis)
    t.start()


import time
time.sleep(10)

使用连接池链接

from redis import Redis
from threading import Thread
import redis
from POOL import pool
def get_name_from_redis():
    # 创建一个连接池,保证它是单例,全局只有一个pool对象:使用模块导入方式实现单例

    conn = redis.Redis(connection_pool=pool) #m每执行一次会从池中取一个链接,如果没有,等待
    res=conn.get('name')
    print(res)
    conn.close()


for i in range(100):
    t=Thread(target=get_name_from_redis)
    t.start()


import time
time.sleep(10)
posted @ 2022-11-14 16:00  小张不爱吃泡面  阅读(35)  评论(0编辑  收藏  举报