Redis

关注公众号“轻松学编程”了解更多。

Windows下直接解压可用,链接:https://pan.baidu.com/s/1rD4ujoN7h96TtHSu3sN_hA 密码:t02c

一、简介

  • redis是一种高速高性能的内存数据库,存储的是键值对数据;
  • 由于极高的存储和访问速度,redis常被用来作为数据缓存服务器;
  • 另外redis是支持数据持久化的(即redis会自动将数据写入磁盘)——这是redis大杀四方的重要原因;
  • redis支持多个slave端同时向master端进行写入,这经常被用在分布式爬虫等场景中;
  • 2010年以后redis开始大面积流行,关系型数据库(核心数据)+redis(缓存)是常规的、常见的数据解决方案;

1 Redis的数据类型

  • 字符串string

    • 单个值最大512M
  • 哈希hash
    • 用于存储对象
  • 列表list
  • 集合set
  • 有序集合zset

二、Redis管理基本操作

  • redis-server.exe redis.windows.conf // 使用配置启动redis服务
  • redis-cli.exe // 打开客户端
  • redis-cli --help // 查看客户端帮助
  • redis-cli -h 127.0.0.1 -p 6379 -a 123456 // 使用密码访问远程redis
  • redis-cli --stat -a 123456 // 查看服务状态
  • help @xxx // 分类帮助信息
  • help @connection
    • select 15 // 选择最后一个数据库(共提供16个数据库)
    • quit // 退出客户端
  • help @server
    • flushdb //清空当前库数据,谨慎使用
    • flushall // 清空所有数据库,谨慎使用
    • monitor // 监视服务端收到的信息
  • auth 123456 // 使用密码登录
  • ping // 测试服务端连接状态

三、Redis数据基本操作

1、 key

  • keys * //显示所有键,慎用,数据量大时导致卡死
  • keys a* // 显示所有以a开头的键
  • exists name age //判断name和age这两个键存在几个
  • type name //查看值的类型
  • del name age //删除键
  • expire name 30 //name键值30秒过期
  • ttl name //查看键值的过期时间
  • persist name // 取消键的过期时间
  • rename name nickname // 重命名键(这样做不安全,容易覆盖已有数据)
  • renamenx name nickname // 确保不会覆盖其它键才重命名(nx=not exists,x后缀=exists)

2、 字符串string

  • 设置

    • set name bill //设置键值
    • setex name 20 bill //键值20秒后过期
    • mset age 60 gender male //一次性存储多个键值
  • 获取
    • get name //不存在则返回null
    • mget name age //一次性拿取多个键值
  • 运算
    • incr/decr age //将age加减1
    • incrby/decrby age 20 //将age加减20
  • 其它
    • append name gates //向原有value拼接字符串,不存在时等同于set
    • strlen key //获取值长度

3、 哈希hash

  • hset p1 name bill // 设置p1对象的name为bill
  • hset p1 age 18 // 设置p1对象的age为18
  • hmset p2 name jobs age -1 //设置p2对象的name为jobs,age为-1
  • hget p1 name // 获取p1的name属性值
  • hmget p1 name age // 同时获取p1的name和age
  • hgetall p1 // 获取p1的全部键值
  • hkeys p1 // 获取p1的全部键
  • hvals p1 // 获取p1的全部值
  • hlen p1 // 获取p1中所有字段的数量
  • hexists p1 name // 判断p1中是否有name字段
  • hdel p1 name // 删除p1中的name字段
  • hdel p2 name age // 删除p2中的name和age字段
  • hstrlen p1 age // p1中的age的长度

4、 列表list

  • lpush mlist 2 // 从左侧向列表mlist追加元素2
  • rpush mlist 3 // 从右侧向列表mlist追加元素3
  • linsert mlist after 3 4 // 在列表mlist中3的后边追加元素4
  • lset mlist 1 200 // 设置列表mlist中的第1个元素为200(下标从0开始)
  • lrange mlist 0 3 // 查看列表mlist中下标[0到3]的元素
  • lrange mlist 0 -1 //从头看到尾
  • lpop mlist // 从列表左侧弹出一个值
  • rpop mlist // 从列表右侧弹出一个值
  • ltrim mlist 0 1 // 修剪掉mlist下标[0,1]以外的元素
  • llen mlist // 列表元素个数
  • lindex mlist 0 // 获取mlist中下标0的元素

5、 集合set

  • sadd mset 1 2 3 4 // 向集合mset中添加元素1,2,3,4
  • smembers mset // 查看集合mset中的元素
  • scard mset // 查询集合元素个数
  • sinter mset mset2 //求mset和mset2的交集
  • sunion mset mset2 // 求mset和mset2的并集
  • sdiff mset mset2 //求mset相比mset2的差集(mset有而mset2无的部分)
  • sismember mset 3 //判断3是否是mset中的元素

6、 有序集合zset

  • zadd mzset 10 bill 9 jobs 6 jackma // 添加多个值及相应权重
  • zrange mzset 0 -1 // 返回第一个到最后一个之间所有的元素,按权重升序排列
  • zcard mzset // 元素个数
  • zcount mzset 6 10 // 下标6-10之间的元素个数
  • zscore mzset jackma // 返回 jackma在mzset中的权重

四、图形界面客户端

链接:https://pan.baidu.com/s/1Ndt61mEK2IFIugUkfdlzuw 密码:q8i5

五、与Python的交互

方法一:
模块引入参考
中的安装第三方模块

方法二:

pip install redis

模块名称:redis。

  • rClient = redis.Redis(…)

    • host,port
    • db
    • password
  • rClient.set(‘name’,‘bill’)
import redis

client = redis.Redis(
host='localhost',
port=6379,
db=5,
password='123456'
) ret = client.set("name", "bill")
print(client.get('name'))#b'bill'
print(ret, type(ret))#True <class 'bool'>
client.mset({'age': 60, 'gender': 'male'})
print(client.mget('name', 'age', 'gender'))#[b'bill', b'60', b'male'] client.hmset("p1", {'name': 'jobs', 'age': -1, 'gender': 'male'})
print(client.hgetall('p1'))#{b'name': b'jobs',
b'age': b'-1',
b'gender': b'male'} client.lpush('mlist', 2, 3, 4)
print(client.lrange('mlist', 0, -1))#[b'4', b'3', b'2'] client.sadd('mset', 'bill', 'steve', '被KO的艺龙')
print(client.smembers('mset'))#{b'steve',
b'\xe8\xa2\xabKO\xe7\x9a\x84\xe8\x89\xba\xe9\xbe\x99',
b'bill'} client.zadd('mzset', 'bill', 10, 'steve', 11, jack=8)
print(client.zrange('mzset',0,-1))#[b'jack', b'bill', b'steve'] print('GAME OVER!')
输出:
Connected to pydev debugger (build 173.4674.54)
b'bill'
True <class 'bool'>
[b'bill', b'60', b'male']
{b'name': b'jobs', b'age': b'-1', b'gender': b'male'}
[b'4', b'3', b'2']
{b'bill', b'\xe8\xa2\xabKO\xe7\x9a\x84\xe8\x89\xba\xe9\xbe\x99', b'steve'}
[b'jack', b'bill', b'steve']
GAME OVER!

六、redis事务

  • redis支持事务的方式

    • 将批量数据操作逐个加入队列
    • 如果批量操作过程中发生异常,不提交事务即可
    • 提交事务,执行队列中的所有操作,并保证其原子性
    • 注意事项
      • 数据操作在加入队列时不会进行语法检查
      • 如果数据操作存在语法错误,会造成只有部分数据提交的BUG
      • 此时redis也并不支持事务回滚
        • 处处拍摄快照会导致效率的下降
      • 所以语法错误必须在上线前自行完成检查和修正
  • 主要事务操作
    • 监控要保障【并发安全】的数据
    • 开启事务
    • 提交事务
      • 如果被监控的数据发生了并发修改,则提交不成功
  • 命令行执行事务
    • WATCH key1 key2 key3

      • 观察本次事务要修改的key,如果该key在事务执行过程中被其它事务修改,则当前事务提交不能成功
      • 目的:保证并发安全
    • multi
      • 开启事务
    • 执行具体事务操作(增删改查)
      • 这些操作会被加入队列
    • exec
      • 提交事务,如果观察的key被其它事务并发修改,则本次事务提交无效
  • Python中执行事务
    • API

      • pipe = client.pipiline()

        • 创建事务管道
      • pipe.watch(‘a’, ‘b’, ‘c’)
        • 监控要保障【并发安全】的数据
      • pipe.multi()
        • 开启事务
      • CRUD…
      • except WatchError as we:…
        • 被监控的数据被其它事务所修改时执行
      • pipe.reset()
        • 清空管道内容
      • pipe.execute()
        • 提交事务
'''
redis事务
·redis事务机制保证【正确事务代码】的原子性(全部执行或全部放弃)
·对于语法错误的代码,redis不支持异常和回滚
·redis的态度:语法错误应该在上线之前自行发现并修正
'''
import redis txClient = redis.Redis(
host='localhost',
port=6379,
db=7,
password='123456' )
pipe = txClient.pipeline(transaction=True)
try:
pipe.watch('who', 'a', 'b', 'c')
pipe.multi()
pipe.set('who', 'leijun', ex=60 * 5)
print(pipe.get('who'))
pipe.hmset('p1', {'who': 'leijun', 'age': 50, 'word': 'are you ok'})
print(pipe.hgetall('p1')) # print(5 / 0)
# 普通业务异常,被try所捕获,事务不会提交
# pipe.incr("p1")
# redis语法错误,只有提交时才会发生异常且无法回滚,必须在上线前予以修正
pipe.incr('a')
pipe.incr('b')
pipe.incr('c')
except WatchError as we:
pipe.reset()#清空管道
print('监控数据被外界污染,事务已取消!we=',we)
except Exception as e:
print("bad luck:e=", e)
print('事务未提交')
else:
try:
pipe.execute()
print('事务已提交')
except Exception as e:
print('事务提交异常,请检查代码语法!e=',e)
输出:
Connected to pydev debugger (build 173.4674.54)
Pipeline<ConnectionPool<Connection<host=localhost,port=6379,db=7>>>
Pipeline<ConnectionPool<Connection<host=localhost,port=6379,db=7>>>
事务已提交

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

关注我,我们一起成长~~

python使用redis缓存数据库的更多相关文章

  1. 第三百节,python操作redis缓存-其他常用操作,用于操作redis里的数据name,不论什么数据类型

    python操作redis缓存-其他常用操作,用于操作redis里的数据name,不论什么数据类型 delete(*names)根据删除redis中的任意数据类型 #!/usr/bin/env pyt ...

  2. 快速搭建Redis缓存数据库

    之前一篇随笔——Redis安装及主从配置已经详细的介绍过Redis的安装于配置.本文要讲的是如何在已经安装过Redis的机器上快速的创建出一个新的Redis缓存数据库. 一.环境介绍 1) Linux ...

  3. 第三百零一节,python操作redis缓存-管道、发布订阅

    python操作redis缓存-管道.发布订阅 一.管道 redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pi ...

  4. 第二百九十九节,python操作redis缓存-SortSet有序集合类型,可以理解为有序列表

    python操作redis缓存-SortSet有序集合类型,可以理解为有序列表 有序集合,在集合的基础上,为每元素排序:元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值, ...

  5. 第二百九十八节,python操作redis缓存-Set集合类型,可以理解为不能有重复元素的列表

    python操作redis缓存-Set集合类型,可以理解为不能有重复元素的列表 sadd(name,values)name对应的集合中添加元素 #!/usr/bin/env python # -*- ...

  6. 第二百九十七节,python操作redis缓存-List类型,可以理解为列表

    python操作redis缓存-List类型,可以理解为列表,是可以有重复元素的列表 List操作,redis中的List在在内存中按照一个name对应一个List来存储.如图: lpush(name ...

  7. 第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型

    第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型 Hash操作,redis中Hash在内存中的存储格式如下图: hset(name, key, value)name ...

  8. 第二百九十五节,python操作redis缓存-字符串类型

    python操作redis缓存-字符串类型 首先要安装redis-py模块 python连接redis方式,有两种连接方式,一种是直接连接,一张是通过连接池连接 注意:以后我们都用的连接池方式连接,直 ...

  9. python操作Redis缓存

    python操作Redis缓存 https://www.cnblogs.com/guotianbao/p/8683037.html 学习资料:电子书资源 联系邮箱:gmu1592618@gmail.c ...

随机推荐

  1. 深入了解Redis(6)-持久化原理

    Redis是一个内存数据库,数据保存在内存中.但我们都知道存储在内存中的数据会因为外部因素而丢失,所以Redis会把数据持久化到磁盘中,至于是如何持久化呢? 一.RDB 1.手动触发 save:该命令 ...

  2. 018 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 12 数据类型转换的基本概念

    018 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 12 数据类型转换的基本概念 本文知识点:Java中的数据类型转换 类型转换 类型转换分类 2类,分别是: ...

  3. 【题解】NOIP2018 赛道修建

    题目戳我 \(\text{Solution:}\) 根据题目信息简化题意,是让你在树上找出\(m\)条路径使得路径长度最小值最大. 看到题第一感先二分一个答案,问题转化为如何选择一些路径使得它们最小值 ...

  4. vue+elmentUI项目的正则判断

    一.为了方便重复利用管理,我创建一个regExp.ts文件来管理正则的表达式,内容如下: 1 /* eslint-disable */ 2 const phoneNumberRegExp = /^[1 ...

  5. 从0到1进行Spark history分析

    一.总体思路 以上是我在平时工作中分析spark程序报错以及性能问题时的一般步骤.当然,首先说明一下,以上分析步骤是基于企业级大数据平台,该平台会抹平很多开发难度,比如会有调度日志(spark-sub ...

  6. MeteoInfo脚本示例:GrADS to netCDF

    这里给出一个将GrADS数据文件转为netCDF数据文件的脚本示例程序,其它格式数据转netCDF可以参考: #-------------------------------------------- ...

  7. 一入Java深似海

    Java的基础语法 一个java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来写协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象: 对象是一个类的实例,有状态和行为.例如 ...

  8. empty()和size() == 0有区别吗

    empty()和size() 这里说的empty()和size()都是STL的容器中提供的接口,分别用来判断当前容器是否为空和获取当前包含的元素个数 区别 其实按道理来说两者应该是相等的,而且STL容 ...

  9. sublime python配置运行

    1.安装python环境 安装完成时,Win+R → 输入cmd → Enter → 调出来命令行,输入python确认安装是否成功. 2.安装sublime 3.打开sublime,选择工具--编译 ...

  10. php安装kafka扩展

    https://blog.csdn.net/zsl10/article/details/78743335 https://blog.csdn.net/lw545034502/article/detai ...