redis介绍,安装,redis基本链接和连接池,redis字符串和hash操作
2022/7/14 2:20:04
本文主要是介绍redis介绍,安装,redis基本链接和连接池,redis字符串和hash操作,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
redis介绍,安装
redis是什么?
- 是一个软件(用c语言写的,初级版本代码只有1w多行 7.x,公司 5.x,4.x多)
- 非关系型(mysql关系型数据库;没有外键关联关系)数据库,nosql(not only sql)数据库,
- 数据都放在内存中(读写速度超级快--》每秒的qps 10w)
- key-value形式存储
- 有5大数据类型(字符串,list,hash(字典),集合,有序集合)
redis好处
(1) 速度快,因为数据存在内存中,类似于python的字典的优势就是查找和操作的速度快
(2) 支持丰富数据类型,支持string,list,set,sorted set,hash
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存(最广泛:缓存数据库),消息,按key设置过期时间,过期后将会自动删除
redis最适合的场景
(1)会话缓存(Session Cache)---》原来session放在了djagno-session表中,速度慢,放到redis中速度超级快
(2)全页缓存,接口缓存:
(3)队列:程序的解耦,不是专业的,真正专业的消息队列:kafka,rabbitmq...
(4)排行榜/计数器:有序集合, 字符串类型做计数器累加(由于6.x之前redis是单线程单进程架构,不存在并发安全问题)
redis为什么这么快?
-1 纯内存操作
-2 使用io多路复用的网络模型(select,poll,epoll模型),epoll模型
-3 单线程,单进程架构,没有进程线程间切换的消耗
redis的安装(linux,mac,win)
-redis作者对win的支持不好---》win不支持epoll的网络模型,只支持select -于是:微软就自己把redis改了改--》编译成可执行文件--》可以运行在win上 -两个大的分支 -一个分支只维护到3.x -https://github.com/microsoftarchive/redis/releases -另一个分支维护到5.x -https://github.com/tporadowski/redis/releases/ -下载完成,一路下一步 -会创建出一个redis服务---(mysql服务),安装路径加入到环境变量了 -以后,启动服务,在任意路径敲 redis-cli 都能识别 -启动redis服务(redis的服务的,执行命令) redis-server.exe redis.windows-service.conf -客户端连接(cmd窗口下) redis-cli -h 127.0.0.1 -p 6379 redis-cli -redis 是key-value存储,但是它默认有16个库 # 图形化客户端--》选择很多 -redis-desktop-manage 源码是个开源软件,用qt写的,图形化界面,开始免费,后来用的人多了,收费了,99永久----》等同于navicate -一路下一步
redis基本链接和连接池
python 写脚本,操作redis,本质python代码就是redis的客户端
下载
pip install redis
普通链接
# 第一步:导入Redis类 from redis import Redis # 第二部: 实例化得到对象 conn=Redis(host="localhost",port=6379,) # 默认连本地 # 第三步:操作数据(非常对方法,操作:字符串,hash,链表操作) conn.set('name','lqz') conn.close()
连接池
pool.py
import redis POOL = redis.ConnectionPool(max_connections=10)
链接
from pool import POOL # 第三步:从池中取一个链接使用 conn = redis.Redis(connection_pool=POOL) # 第四步:操作数据(非常对方法,操作:字符串,hash,链表操作) conn.set('age', '19') conn.close()
redis字符串操作
redis:5大数据类型---》字符串,链表,hash,集合,有序集合
redis支持5大数据类型,只支持到一层,第二层必须是字符串
Memcached:只支持字符串,都是纯内存,断电数据丢失,redis可以持久化
from redis import Redis conn = Redis() # 1 set(name, value, ex=None, px=None, nx=False, xx=False) # conn.set('name','pyy') # ex:过期时间(秒),px,过期时间(毫秒) # conn.set('age',19,ex=5) # 过期就没有了---》最适合存 验证码 # nx,如果设置为True,则只有name不存在时,当前set操作才执行,值存在,就修改不了,执行没效果 # conn.set('name','lyf',nx=True) # conn.set('name','lyf') # xx,如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在,不会设置新值 # conn.set('name','lqz',xx=True) # 2 setnx(name, value)--->等同于set nx=True # conn.setnx('name','xxx') # 3 psetex(name, time_ms, value) # 以毫秒计时 # conn.psetex('age',3000,'19') # 4 mset(*args, **kwargs) # 批量设置 # conn.mset({'age': 19, 'name': 'lxx', 'wife': '刘亦菲'}) # 面试:一次mset和多次set的区别? # 4 get(name) # 获取值 # res=conn.get('wife') # print(str(res,encoding='utf-8')) # s='李清照' # print(bytes(s,encoding='utf-8')) # 5 mget(keys, *args) # 批量获取值 # res=conn.mget('name','age','wife') # res=conn.mget(['name','age','wife']) # print(res) # 6 getset(name, value) # 获取并设置值 # res=conn.getset('name','彭于晏') # print(res) # 7 getrange(key, start, end) # 根据起始和终止,获取字符串,以字节计数 ,中在redis中存储是用utf-8存储的 # res=conn.getrange('name',0,2) # print(str(res,encoding='utf-8')) # 8 setrange(name, offset, value) # 指定位置设置值 # conn.setrange('name',3,'bbb') # 9 setbit(name, offset, value) # 指定比特位修改成 # conn.setbit('name',7,0) # 00000000 00000000 00000000 # 10 getbit(name, offset) # 了解 # print(conn.getbit('name',7)) # 11 bitcount(key, start=None, end=None) # print(conn.bitcount('name',0,4)) # 12 strlen(name) # 返回name对应值的字节长度 # print(conn.strlen('name')) # 13 incrby(self, name, amount=1) # 计数器 # conn.incrby('age') # 14 incrbyfloat(self, name, amount=1.0) # conn.incrbyfloat('age') # 15 decrby(self, name, amount=1) # conn.decrby('age') # 16 append(key, value) # conn.append('name','sb') conn.close()
redis hash操作
字典---》基于数组存储---》根据key值通过hash函数运算得到一个地址,把value值放进去
from redis import Redis conn = Redis() # 1 hset(name, key, value) # conn.hset('userinfo','name','lqz') # conn.hset('userinfo','age','29') # 2 hmset(name, mapping) # conn.hmset('userinfo1', {'name': 'pyy', 'age': 39}) # conn.hset('userinfo2',mapping={'name': '刘亦菲', 'age': 39}) # 3 hget(name,key) # print(conn.hget('userinfo','age')) # 4 hmget(name, keys, *args) # print(conn.hmget('userinfo',['name','age'])) # 5 hgetall(name) # 慎用---》如果hash类型数据量特别大,很可能撑爆内存 # print(conn.hgetall('userinfo')) # 6 hlen(name) # print(conn.hlen('userinfo')) # 7 hkeys(name) # print(conn.hkeys('userinfo')) # 8 hvals(name) # print(conn.hvals('userinfo')) # 9 hexists(name, key) # print(conn.hexists('userinfo','wife')) # print(conn.hexists('userinfo','age')) # 10 hdel(name,*keys) # conn.hdel('userinfo','age') # 11 hincrby(name, key, amount=1) # conn.hincrby('userinfo1','age') # 12 hincrbyfloat(name, key, amount=1.0) # 注意一下---》不建议使用hgetall---》分批取值 # for i in range(1000): # conn.hset('htest','name_%s'%i,'鸡蛋_%s'%i) # res=conn.hgetall('htest') # print(res) # 13 hscan(name, cursor=0, match=None, count=None)--- >这个不是直接用,需要配合hscan_iter来用 # res=conn.hscan('htest',cursor=0,count=55) # print(res) # print(len(res[1])) # 14 hscan_iter(name, match=None, count=None) # 把htest数据全取出来打印,批量获取,每次取10条 for item in conn.hscan_iter('htest',count=10): print(item) # for item in conn.hgetall('htest'): # print(item) conn.close()
这篇关于redis介绍,安装,redis基本链接和连接池,redis字符串和hash操作的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-24Redis资料:新手入门快速指南
- 2024-12-24Redis资料:新手入门教程与实践指南
- 2024-12-24Redis资料:新手入门教程与实践指南
- 2024-12-07Redis高并发入门详解
- 2024-12-07Redis缓存入门:新手必读指南
- 2024-12-07Redis缓存入门:新手必读教程
- 2024-12-07Redis入门:新手必备的简单教程
- 2024-12-07Redis入门:新手必读的简单教程
- 2024-12-06Redis入门教程:从安装到基本操作
- 2024-12-06Redis缓存入门教程:轻松掌握缓存技巧