【Python】Redis

87 阅读8分钟

背景

随着互联网+大数据时代的来临,传统的关系型数据库已经不能满足中大型网站日益增长的访问量和数据量。这个时候就需要一种能够快速存取数据的组件来缓解数据库服务I/O的压力,来解决系统性能上的瓶颈。

什么是redis:

Redis 全称 Remote Dictionary Server(即远程字典服务),它是一个基于内存实现的键值型非关系(NoSQL)数据库,是由c语言编写的。

常见的内存型数据库,除 Redis 之外,还有 Oracle Berkeley DB(甲骨文旗下的一款产品)、SQlite(轻量级内存数据库)、Memcache(键值型分布式缓存数据库)、Altibase(基于内存的高性能数据库)。

特点:

  • Redis 不仅可以将数据完全保存在内存中,还可以通过磁盘实现数据的持久存储;
  • Redis 支持丰富的数据类型,包括 string、list、set、zset、hash 等多种数据类型,因此它也被称为“数据结构服务器”;
  • Redis 支持主从同步,即 master-slave 主从复制模式。数据可以从主服务器向任意数量的从服务器上同步,有效地保证数据的安全性;
  • Redis 支持多种编程语言,包括 C、C++、Python、Java、PHP、Ruby、Lua 等语言。

优势:

  • 性能极高:Redis 基于内存实现数据存储,它的读取速度是 110000次/s,写速度是 81000次/s;
  • 多用途工具: Redis 有很多的用途,比如可以用作缓存、消息队列、搭建 Redis 集群等;
  • 命令提示功能:Redis 客户端拥有强大的命令提示功能,使用起来非常的方便,降低了学习门槛;
  • 可移植性:Redis 使用用标准 C语言编写的,能够在大多数操作系统上运行,比如 Linux,Mac,Solaris 等。

Redis架构:

Redis体系架构主要分为两个部分:

  • Redis服务端
  • Redis客户端

客户端和服务端可以位于同一台计算机上,也可以位于不同的计算机上。服务端是整个架构的“大脑”,能够把数据存储到内存中,并且起到管理数据的作用。

应用场景:

Redis 用来缓存一些经常被访问的热点数据、或者需要耗费大量资源的内容,通过把这些内容放到 Redis 中,可以让应用程序快速地读取它们。例如,网站的首页需要经常被访问,并且在创建首页的过程中会消耗的较多的资源,此时就可以使用 Redis 将整个首页缓存起来,从而降低网站的压力,减少页面访问的延迟时间。

Redis 学习地址:

1、官网地址:redis.io/

2、命令地址:doc.redisfans.com/

3、更多配置文件: www.cnblogs.com/kreo/p/4423…

redis与其他数据库的对比:

数据库的存储方式大体可分为两大类,基于磁盘存储和基于内存存储。磁盘存储的数据库,因为磁头机械运动以及系统调用等因素导致读写效率较低。Redis 基于内存来实现数据存取,相对于磁盘来说,其读写速度要高出好几个数量级。

image.png

Redis 基于内存来实现数据的存储,因此其速度非常快。但是,计算机的内存是非常珍贵的资源,所以 Redis 不适合存储较大的文件或者二进制数据,否则会出现错误,Redis 适合存储较小的文本信息。理论上 Redis 的每个 key、value 的大小不超过 512 MB。总得来说,上述数据库各有优势,选用数据库时,也要因地制宜,选择一款与业务场景最相符合的数据库。

redis的安装与配置 for Mac M2:

1. 先查看版本:brew -v

遇到问题:在存储库中检测到可疑的所有权。

image.png

【解决方案】 根据提示,输入git开头的两行命令 blog.csdn.net/dodo_xu/art…

Homebrew 的国内源、国外源: www.cnblogs.com/tu-0718/p/1…

2. 然后再次 brew -v,如下图,即安装成功

image.png

3. 安装git:brew install git

image.png

4. 安装:brew install redis

image.png

测试 Redis 安装,可以redis-server从命令行运行可执行文件:

image.png

如果成功,将会看到 Redis 的启动日志,并且 Redis 将在前台运行。

要停止 Redis,请输入Ctrl-C

拓展:

其它命令: If you need to have redis@6.2 first in your PATH, run:(如果需要将 redis@6.2 放在 PATH 的第一位,请运行:)

echo 'export PATH="/opt/homebrew/opt/redis@6.2/bin:$PATH"' >> ~/.zshrc

To start redis@6.2 now and restart at login:(立即启动 redis@6.2 并在登录时重启:)

brew services start redis@6.2

Or, if you don't want/need a background service you can just run:(或者,如果你不想/不需要后台服务,可以直接运行:)

/opt/homebrew/opt/redis@6.2/bin/redis-server /opt/homebrew/etc/redis.conf

启动redis服务:

brew services start redis@6.2

关闭服务:

brew services stop redis@6.2

重启:

brew services restart redis@6.2

打开图形化界面:

redis-cli

一些常用的配置:

1.开机启动redis命令:

ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents

2.使用配置文件启动redis-server:

redis-server /usr/local/etc/redis.conf

3.停止redis服务:

redis-cli shutdown

4.redis配置文件位置

/usr/local/etc/redis.conf

5.卸载redis

brewuninstallredis rm ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

redis数据库常用命令

select 0:切换数据库,默认有16个数据库,0-15,下标从0开始

DBSIZE:查看当前数据库的 key 数量

keys*:查看 key 的内容

flushdb: 清空当前数据库的 key 的数量

flushall:清空所有库的 key(慎用)

existe key:判断 key 是否存在

redis常用五大数据类型

redis-string:

image.png string是redis最基本的类型,一个key对应一个value;

string可以包含任何数据,最大不能超过512M

  • set:设置值
  • get:获取值
  • mset:设置多个值
  • mget:获取多个值
  • append:添加字段
  • del:删除
  • strlen:返回字符串的长度

  • incr:增加
  • dect:减少
  • incrby:制定增加多少
  • decrby:制定减少多少

  • getrange:获取指定区间范围内的值,类似 between...and...
  • setrange:代表从第几位开始替换,下脚本从0开始(从0 -1表示全部)

redis-list(单值多value)

List(列表)

列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素列表的头部(左边)或者尾部(右边) 它的底层实际是个链表。

  • lpush / rpush / lrange:从左/从右获取指定长度
  • lpush list01 1 2 3 4 5 倒序排列
  • rpush list02 1 2 3 4 5 正序排列
  • lrange list01 0 -1 获取list01中的所有值

  • lpop / rpop 移除最左/最右
  • lpop list01 删除元素5
  • rpop list01 删除元素1

lindex,按照索引下标获得元素(从上到下)

  • lrange list01 0 -1
  • lindex list01 1

llen,求列表长度

  • llen list01

lrem key 删 N 个 value lrem list01 2 1 在list01中删除2个1


ltrim key,从开始index 结束 index,截取指定范围的值后,再赋值给 key

  • ltrim list01 0 2 截取list01 从0到2的数据,在赋值给list01

rpoplpush list1 list2 将 list1 中最后一个压入到 list2 中的第一位

  • lrange list01 0 -1
  • lrange list02 0 -1
  • rpoplpush list01 list02

lset key index value lset list01 0 x 将list01中的第一位换成x


linsert key before/after

  • linsert list01 before x php 在x之前加字段 php

redis-Hash

hash是一个键值对集合 hash是一个string类型的field和value的映射表,hash特别适合存储对象;

  • 设值、取值、设置多个值、取多个值、取全部值、删除值
hset user id 11
hget user id
hmset customer id 11 name juran age 26
hmget customer id name age  只返回相应的值
hgetall customer            返回全部
hdel user id                删除ID
  • hlen 求哈希长度
hlen customer
  • hexists key
hexists keykey里面的某个值
存在返回1,不存在返回0
  • hkeys / hvals
返回哈希表 key 中的所有域
hkeys students

返回哈希表 key 中所有域的值:
hvals students

redis-set(不重复的)

Set(集合) set是string类型的无序集合;

sadd / smenmbers / sismember  添加/查看集合/查看是否存在

sadd set01 1 2 2 3 3  去掉重复添加

smembers set01        得到set01

sismemher set01 1     如果存在返回1,不存在返回0
scard   获取集合里面的元素个数

scard set01
screm key value
screm    删除集合中的元素

screm set01 3
SMEMBERDS set01   3已经被删除掉
srandmember key
srandmember  随机出几个数
sadd set02 1 2 3 4 5 6 7 8
srandmember set02  2
spop key 随机出栈
spop set01
smove key1 key2
sadd set03 x y z
smove set01 set03 2   将set01中的2 移动到 set03 中

redis-Zset

Zset(有序集合)

zadd / zrange
zadd zset01 60 v1 70 v2 80 v3 90 v4 100 v5
zrange zset01 0 -1
带分数返回  withscores
zrangebyscore key start end 根据开始结束来取值

zrangebyscore zset01 60 70

zrangebyscore zset01 60 (90  表示不包含90

zrangebyscore zset01 60 90 limit 1 2  从第一条开始截取2
zrem key value  某 score 下对应的 value 值,作用是删除元素

zrem zset01 v1
zcard / zcount key score 区间 / zrank key values

zcard  求 zset01总条数
zcount zset01 60 9060-90个数
zrank zset01 v2 返回1 返回对应下角标,从0开始