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. mysql 空值(null)和空字符('')的区别

    日常开发中,一般都会涉及到数据库增删改查,那么不可避免会遇到Mysql中的NULL和空字符. 空字符(")和空值(null)表面上看都是空,其实存在一些差异: 定义: 空值(NULL)的长度 ...

  2. # js权威指南之对象篇

    对象是js中的关键 属性查找 in,Object.hasOwnProperty(),Object.propertyIsEnumerable()都能检测出对象内是否存在某个属性 in关键字 自有属性/继 ...

  3. C++赋值兼容原则理解

    –赋值兼容原则(派生类对象是基类对象,反之不成立)–基类指针强制转换成派生类指针–派生类中重定义基类成员(同名覆盖) 假设, 一个基类 "普通人", 一个派生类 "超人& ...

  4. 【字符串算法】AC自动机

    国庆后面两天划水,甚至想接着发出咕咕咕的叫声.咳咳咳,这些都不重要!最近学习了一下AC自动机,发现其实远没有想象中的那么难. AC自动机的来历 我知道,很多人在第一次看到这个东西的时侯是非常兴奋的.( ...

  5. 003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程

    003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程 Java程序长啥样? 首先编写一个Java程序 记事本编写程序 打开记事本 1.wi ...

  6. 001 发大招了 神奇的效率工具--Java代码转python代码

    今天发现一个好玩的工具: 可以直接将java转成python 1. 安装工具(windows 环境下面) 先下载antlr: 下载链接如下: http://www.antlr3.org/downloa ...

  7. 下载、安装 PL/SQL Developer

    操作系统:Windows 10 x64 第一节:下载 Oracle Database XE 11gR2 第二节:安装.验证安装 Oracle Database XE 11gR2 第三节:Oracle ...

  8. CSG:清华大学提出通过分化类特定卷积核来训练可解释的卷积网络 | ECCV 2020 Oral

    论文提出类特定控制门CSG来引导网络学习类特定的卷积核,并且加入正则化方法来稀疏化CSG矩阵,进一步保证类特定.从实验结果来看,CSG的稀疏性能够引导卷积核与类别的强关联,在卷积核层面产生高度类相关的 ...

  9. MySql 关闭 bin 和 log 日志

    mysql 的 bin 和 .log 日志文件会非常占用磁盘空间和 IO,修改 mysql 配置文件可以关闭这两种日志的记录. 关闭 bin 日志,将下面三项配置注释掉: #log_bin = mys ...

  10. kubernetes-介绍与特性

    1. kubernetes概述 1) kubernetes是什么 2) kubernetes能做什么 3) kubernetes特性 4) kubernetes集群架构与组件 5) kubernete ...