redis教程
已于 2025年02月19日 16:21 修改
访问次数:12
Redis 超详细教程
一、安装测试
- 安装: sudo apt-get install redis
- 测试性能: redis-benchmark -q -n 10000
- redis的默认端口号为:6379
- redis没有用户、只有密码
二、启动redis服务
sudo /etc/init.d/redis-server status|start|stop|restart三、客户端连接
1.redis客户端连接redis服务器
redis-cli -h ip地址 -p 6379 -a 密码2. 测试是否成功连接服务器
# ping如果返回pong则表示已经连接到redis服务器ping3.redis远程连接
- 注释掉配置文件中本地ip地址绑定# bind 127.0.0.1 :: 1
- 关闭保护模式88行 protected-mode no
- 重启服务sudo /etc/init.d/redis-server restart
四、redis配置及基础命令
1. redis配置文件:
- redis配置文件 /etc/redis/redis.conf
- redis密码: requirepass + -密码
2.redis基础命令
- select number: 选择数据库(redis默认有15个数据库, 编号0-14)
- info: 查看redis服务的整体情况
- keys + 正则表达式:# *和?的含义符合正则表达式keys * 匹配数据库中所有keykeys h?llp 匹配hello,hallo等 ?匹配一个任意字符
- type key : 返回当前key的类型
- exists key: 返回当前键是否存在 1:存在 0:不存在
- del key: 删除key
- rename key newkey:重命名key
- flushdb:清除当前数据库数据
- flushall:清除数据库数据
五、redis的数据类型
1.字符串类型
- 字符串、数字、都会转换为字符串来存储
- 以二进制的方式存储在内存中
注意:
key:
- key命名规范可以采用 ----wang:email
- key命名原则1.不宜过长,过长会小号内存,而且在数据中查找这类键值的计算成本搞2.不宜过短,过短可读性比较差
值:
- 一个字符串类型的值最多能存储512M的内容
1.1 字符串类型数据常用命令
- set key value + 可选(nx ex): 注释--设置一个类型为字符串的key:value ;nx --> not exist(当key不存在与数据库中时候创建key并且对应的值为value) ;ex-->expire 过期时间,单位s。
- get key: 获取key对应的value,返回值为key对应的value 或者'nil'
- strlen key: 获取key长度
- getrange key start stop: 获取key的指定范围[start, stop]双闭区间切片内容
- setrange key index value: 从index开始,使用value替换原内容;并返回最新长度
- append key value:在key对应的原value(字符串后面追加一个字符串。与python列表的append方法相同)
- mset key1 value1 key2 value2 ....:批量添加key:value
- mget key1 key2 key3: 批量获取key1 .... 的值
- incrby key step: 将key对应的value增加指定数值
- decrby key step: 将key对应的value减少指定数
- incr key: +1
- decr key: -1
- incrbyfloat key step:
- 注意:incr、incrby、decr、decrby、incrbyfloat都只能对value是纯数字的字符串操作,否则报错
1.2 再谈过期时间
1.2.1 设置过期时间
默认情况下,key没有过期时间,需要手动指定
方案1:直接用set的ex参数
方案2:使用expire通用命令
- set key value
- expire key time #以秒为单位
- pexpire key time #以毫秒为单位
1.2.2 查看过期时间
使用ttl key 命令:
返回值:
- -1 :代表当前key没有过期时间
- 大于0: 代表当前key的剩余存活时间
- -2:代表查询的key不存在与数据库中
1.2.3 删除过期时间(把带有过期时间的key变为无过期时间的key)
使用命令 persist key:
返回值:
- 1: 代表删除过期时间成功
- 0:代表当前key没有过期时间,或者key不存在于数据库中
1.3 字符串类型的位操作
1.3.1 SETBIT命令
- 语法格式:setbit key offset value
- 说明:设置key对应value(value必须是字符串)的位于offset处的二进制值
- 参数:offset ---偏移量,从0开始 value : 0/1
- 注意如果offset大于字符串value的长度时,自动在字符串后面补8bit全0,之后再设置offset位
- SETBIT命令:key不存在:初始化8bit, 全0key存在:1.满足长度要求直接修改位 2.offset大于value位长时候, 补8bit全0位后再置位
1.3.2 GETBIT命令
- 语法: getbit key offset
- 说明:获取指定位的值
1.3.2 BITCOUNT命令
- 说明:统计key对应value的位中的1的数量,双闭区间
- 语法:bitcount key start end
2.列表类型
2.1基本概念
- 元素是字符串类型
- 列表的头尾增删块,中间增删慢,增删元素是常态(推测是使用双向头尾节点链表)(插入元素顺序与查找结果相反,推测使用头插法建立的链表)
- 元素可重复
- 最多包含2^32-1个元素
- 索引方式与python列表相同
2.2常用命令
2.2.1 增加数据
1.Lpush key value1 value2...
- 说明:从列表头部压入元素
- 返回:list的最新长度
2.Rpush key value1 value2 ....
- 说名:从尾部压入元素
- 返回:list的最新长度
3、RPOPPUSH src dst:
- 说明:从列表src尾部弹出一个元素、压入到泪飙dst的头部
- 返回值:被弹出的元素
4、LINSERT key after|before value newvalue
- 说明:再key对应的列表的指定元素的后/前插入元素
- 返回:如果执行成功,返回泪飙的长度如果没有找到pivot,返回-1如果key不存在或key对应的value为空列表,返回0
2.2.2 查看数据
1.查看列表中的元素
LRANGE key start stop
2. 获取列表长度
LLEN key
2.2.3 删除列表数据
- 从列表头部弹出一个元素: LPOP key
- 从列表尾部弹出要给元素: RPOP key
- 列表头部阻塞弹出,列表为空时阻塞:BLPOP key timeout
- 列表尾部阻塞弹出,列表为空时阻塞:BRPOP key timeout
- 注意:BLPOP 和BRPOP说明:如果列表为空或者列表不存在就会阻塞,等待timeout退出或者有数据时候删除数据后退出如果timeout = 0 就是永久阻塞、直到有数据可以谈粗如果多个客户端阻塞再同一个列表上,使用first in first out原则,先到先服务
- 删除指定元素:LREM key count value说明:(LREM---LREMOVE)count > 0: 表示从头开始搜索列表,移除值为value的元素,数量为countcount < 0:表示从尾开始搜索列表,移除值为value的元素,数量为count绝对值count = 0: 表示移除列表中索引与value值相等的值返回值:被实际移除元素的数量
- 删除质地的那个范围外的元素,保留指定范围内的元素:LTRIM key start stop [start, stop]双闭区间返回值:ok场景:保存尾部评论最后500条LTRIM weibo:comments 0 499
3.哈希
3.1 基本概念及定义
- 由field和关联的value组成的键值对
- field和value是字符串类型
- 一个hash中最多包含2^32个键值对
3.2 优缺点
- 优点:节约内存空间---特定条件下(字段小于512个,value不超过54个字节)可按需获取字段的值
- 缺点(不适合hash的情况)不能设置value中field字段的过期时间,只能设置最外层key的过期时间存储消耗大于字符串结构
3.3hash类型数据常用命令
- 设置单个字段(field):# 设置key对应的hash值中的file和valueHSET key field value# 当key对应的hash值中不存在field时候,添加field字段并设置field的valueHSETNX key field value
- 设置多个字段HMSET key field value field value
- 查询key对应hash值的字段个数HLEN key
- 判断字段是否存在:不存在返回0HEXISTS key field
- 查询字段值:HGET key field
- 查询多个字段值HMGET key field1, field2...
- 查询key对应的值为hash类型的所有键值对(field:value)HGETALL key
- 查询key对应值为hash类型的数据的所有fieldHKEYS key
- 查询所有hash类型的valueHVALS key
- 删除key对应hash值中的filed字段和其对应的valueHDEL key field
- 加/减法:对key对应的hash值的field字段的数值型value做加法加数为incrementHINCRBY key field incrementHINCRBYFLOAT key field incrementHDECRBY key field decrementHDECRBYFLOAT key field decrement
4. 集合
4.1 redis数据类型:集合的基本概念
- 无序、去重
- 元素是字符串类型
- 最多包含2^32 -1个元素
- 类似于python中所学的集合
4.2 redis集合的常用命令
- 增加一个或者多个元素sadd key member1 member2...
- 查看集合中所有元素smembers key
- 删除一个或者多个元素,元素不存在时忽略srem key member1 member2...
- 判断元素是否存在sismember key member
- 随机返回集合中count个数的元素,默认为1个srandmember key [count]
- 弹出成员spop key [count]
- 返回集合中元素的个数scard key
- 把元素从源集合移动到目标集合(source 和 destination都是key)smove source destination member
- 差集(key1 - key2)sdiff key1 key2
- 差集保存到另一个集合中sdiffstore destination key1 key2
- 交集sinter key1 key2# 交集保存到destinationsinterstore destination key1 key2
- 并集sunion key1 key2# 并集结果保存到destinationsunionstore destination key1 key2
5. 有序集合
5.1 有序集合的基本概念
- 有序、去重
- 元素是字符串类型
- 每个元素都关联着一个浮点分数值(score),并按照分支从大到小的顺序排列集合中的元素(分支可以相同)
- 最多包含2^32-1元素
5.2 常用命令
- 添加成员:返回值为成功插入到集合中的元素的个数zadd key score1 member1 score2 member2...
- 查看指定区间(这里的区间指的是集合索引区间)元素(升序):如果不使用可选参数withscores, 则只显示集合的元素(member)不显示member对应的scorezrange key start stop [withscores]# 例如:zrange key 0 1>>>1)'tongqing'zrange key 0 1 withscores>>>1)'tongqing'>>>2)'122'
- 查看指定区间(集合索引区间)元素(降序)zrevrange key start stop [withscores]
- 查看指定区间(scores 的范围)元素zrangebyscore key min max [withscores] [limit offset count]# 双开区间zrangebyscore key (min (max [withscores] [limit offset count]# 左开区间zrangebyscore key (min max withscores [limit offset count]# limit offset countzrangebyscore key min max withscores limit 0 3#相当于 显示三条符合查询条件的结果 min/max 表示score在区间【min,max】上,默认双闭区间(使用"(min max"可以开启左开右闭区间)limit:与mysql中的limit用法相同offset:跳过多少个元素不显示count:返回元素总数量
- 查看指定元素的分值zscore key member
- 删除成员zrem key member
- 增加或者减少分值zincrby key increment memberzdecrby key decrement member
- 返回元素排名(排在升序的第几位,也就相当于是元素的索引值)zrank key member
- 返回元素逆序排名zrevrank key member
- 删除score在指定区间内的元素(默认双闭区间,开区间的设置与(4)中相同)zrremrangebyscore key min max
- 返回集合中元素个数zcard key
- 返回指定score范围中元素的个数zcount key min max
- 并集# 使用weihts参数时候并集元素的score乘以相应weight# aggregae参数用来处理多个源集合中元素名相同但score不同(也可以相同)的情况,可以将同名元素相加、取最小值、取最大值: sum|min|maxzunionstore destination numOfKeys key1 key2...[weights] weight1 weight2... aggregate sum|min|max
- 交集同并集zinterstore destination numOfkeys key1 key2...[weights] weight1 weight2...aggregate sum|min|max
六 、pyredis操作redis(pyredis查询或者pop返回值为元组)
1、此操作流程
- 导入redis库并且创建redis数据库连接对象import redisrds = redis.Redis(host='127.0.0.1', port=6379, db=0, password='1132')
- 使用连接对象.redis即可命令操作redis数据库rds.set(key,value)
- 关闭redis连接rds.close()
七、redis事务
1.事务命令
- 开启事务: multi相当于mysql中的begin/start transaction
- 执行命令
- discard:取消该事务中的命令在exec命令之前,类似于mysql中rollback,但mysql中的rollback是撤销已执行的命令,而redis事务中的命令在exec之前并没有执行,而是将命令保存在相应的存储空间中,等待exec命令之后才执行
- exec:相当于mysql中的commit
1.1 redis事务中的乐观锁
- 事务过程中,可以对指定的key进行监听,命令提交时,若事务中某一条命令操作了---已经被另一个命令(这个命令不是当前事务中的命令)修改过的key,则事务不会被执行
- 简而言之:watch key,如果被监控的key在事务执行前被修改则包含对此键key有操作的事务不被执行
- 乐观锁的生存周期为:当一个事务操作了被监控的key,并且成功执行了改事务,则该key的乐观锁被取消,其他key的乐观锁依旧生效
2. python中redis流水线
# 导入redis库# 设置redis连接池的信息pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=0, password='1132')# 创建连接池r = redis.Redis(connection_poll = pool)# 利用连接池实例化流水线对象pipe = r.pipeline()# 利用流水线存储redis命令pipe.set('fans',s50)pipe.incr('fans')# 提交流水线中的redis命令pipe.execute()3.python操作redis操作事务
# 导入redis库# 设置redis连接池的信息pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=0, password='1132')# 创建连接池r = redis.Redis(connection_poll = pool)with r.pipeline(transaction=true) as pipe: pipe.multi() pipe.lpush('transction', 1) pipe.lpush('transction', 2) values = pipe.execute()八、redis数据持久化存储
1. redis持久化的概念
顾名思义,redis数据持久化过程就是将内存中的redis数据存储到磁盘的过程
2.出发redis的rdb持久化
2.1使用save 命令
- save命令完成之前,redis服务器将会被阻塞,任何操作redis服务器的命令都会被阻塞至save完成2.
- 如果RDB文件已经存在,那么服务器会自动使用新的rdb文件替换旧的rdb文件
2.2使用bgsave创建备份文件
客户端执行过程如下:
- 客户端发送bgsave给服务器
- 服务器马上返回 backgroud saving started给客户端
- 服务器创建子进程做数据备份
- 服务器继续给客户端提供服务
- 子进程备份完RDB文件后再告知redisfuwuq
评论(0)