1 Redis介绍与安装
| |
| -nosql: 非关系型数据库 |
| -C语言写的 服务(监听端口),用来存储数据的,数据是存储在内存中,取值,放值速度非常快, 10w qps |
| |
| |
| -1 纯内存操作 |
| -2 网络模型使用的IO多路复用(epo11)(可以处理的请求数更对多) |
| -3 6.x之前,单进程,单线程架构,没有线程进程间切换,更少的消耗资源 |
| |
| |
| |
| |
| |
| 最新: 7.x |
| 公司里: 5.x比较多 |
| |
| |
| -mac 源码编译安装 |
| -linux 源码编译安装 |
| -win 微软自己 基于源码改动,编译成安装包 |
| |
| https://github.com/tporadowski/redis/releases/ |
| |
| https://github.com/microsoftarchive/redis/releases |
| 一路下一步,安装完成释放出两个命令,会把redis自动加入到服务中 |
| redis-server |
| redis-cli |
| |
| redis-server |
| redis-cli |
| redis.windows-service.conf 配置文件 |
| -blind 127.0.0.1 |
| -port 6379 |
| |
| |
| |
| 1 方式一: |
| -在服务中,点击启动,后台启动 |
| 2 方式二: 使用命令 |
| redis-server 指定配置文件 如果不指定,会默认 |
| |
| |
| 1 方式一 |
| redis-cli |
| 2 方式二: |
| redis-cli -h 地址 -p 端口 |
| |
| |
| 3 使用图形化客户端操作 |
| -Redis Desktop Manager : 开源的,原来免费,后来收费 推荐用(mac, win,linxu 都有) |
| -Qt5 qt是一个平台,专门用来做图形化界面的 |
| -可以使用 C++写 |
| -可以使用Python写 pyqt5 使用python写图形化界面(少量公司再用) |
| -resp-2022.1.0.0.exe 一路下一步,安装完启动起来 |
| -Redis Client 小众 |
| |
| 图形化界面,连接redis 输入地址和端口 点击连接即可 |
| |
2 Redis普通连接和连接池
| |
| |
| |
| |
| |
| |
| -可能会有问题,并发数过高,导致mysql连接数过高,影响Mysql性能 |
| -使用django连接池: |
| https://blog.51cto.com/liangdongchang/5140039 |
2.2 连接池连接
| |
| import redis |
| POOL = redis.ConnectionPool(max_connections=10,host='127.0.0.1',port=6379) |
| |
| |
| |
| import redis |
| from threading import Thread |
| from pool import POOL |
| def task(): |
| |
| conn = redis.Redis(connection_pool=POOL) |
| print(conn.get('name')) |
| |
| for i in range(1000): |
| t = Thread(target=task) |
| t.start() |
| |
2.3 单例模式:设计模式
导入的6种方式(具体使用会重新开博客总结)
| |
| 其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。 |
| |
| |
| |
| |
| |
| |
| |
| |
3 Redis之字符串类型
| |
| |
| |
| |
| -字符串: 用的最多,做缓存:做计数器 |
| -列表: 简单的消息队列 |
| -字典(hash): 缓存 |
| -集合: 去重 |
| -有序集合: 排行榜 |
字符串类型使用
| ''' |
| 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) |
| ''' |
| |
| import redis |
| |
| conn = redis.Redis() |
| |
| 1 set(name, value, ex=None, px=None, nx=False, xx=False) |
| |
| |
| |
| |
| |
| conn.set('hobby','篮球', ex=6) |
| |
| conn.set('hobby','篮球', px=6) |
| |
| conn.set('name','wei',nx=True) |
| |
| conn.set('name','lqz',nx=False) |
| |
| |
| conn.set('hobby','篮球',xx=True) |
| conn.set('hobby','篮球',xx=False) |
| |
| |
| |
| |
| 2 setnx(name, value) |
| |
| conn.setnx('name', '刘亦菲') |
| |
| 3 setex(name, value, time) |
| |
| conn.setex('wife', 3, '刘亦菲') |
| |
| |
| 4 psetex(name, time_ms, value) |
| conn.psetex('wife',3000,'刘亦菲') |
| |
| 5 mset(*agrs, **kwargs) |
| conn.mset({'wife':'刘亦菲','hobby':'篮球','job':'码农'}) |
| |
| 6 get(name) |
| print(str(conn.get('wife'),encoding='utf-8')) |
| print(conn.get('wife')) |
| |
| 7 mget(keys, *args) |
| res=conn.mget('wife','hobby') |
| res=conn.mget(['wife','hobby']) |
| |
| 8 getset(name, value) |
| res=conn.getset('wife','迪丽热巴') |
| print(res) |
| |
| 9 getrange(key, start, end) |
| res = str(conn.getrange('wife', 0, 2), encoding='utf-8') |
| print(res) |
| |
| 10 setrange(name, offset, value) |
| conn.setrange('wife',2,'bbb') |
| |
| |
| 11 setbit(name, offset, value) |
| 12 getbit(name, offset) |
| 13 bitcount(key, start=None, end=None) |
| |
| |
| 14 bitop(operation, dest, *keys) 获取多个值,并将值做位运算,将最后的结果保存至新的name对应的值 |
| |
| 15 strlen(name) |
| res = conn.strlen('hobby') |
| print(res) |
| |
| 16 incr(self, name, amount=1) |
| |
| conn.incr('age') |
| |
| |
| 17 incrbyfloat(self, name, amount=1.0) |
| |
| |
| 18 derc(self, name, amount=1) |
| conn.decrby('age') |
| conn.decrby('age',-1) |
| |
| 19 append(key, value) |
| conn.append('hobby','sb') |
| |
| print(conn.strlen('hobby')) |
| |
| conn.close() |
| |
| ''' |
| 你需要记住的 |
| set |
| get |
| strlen 字节长度 |
| incr |
| ''' |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构