Redis基础

Redis简介

  • redis是Nosql数据库中使用较为广泛的非关系型内存数据库
  • redis内部是一个key-value存储系统
  • redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
  • redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • redis支持数据的备份,即master-slave模式的数据备份。

redis的特性

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子性 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

redis与其他key-value存储有什么不同?

  • redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
  • redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

redis数据类型

redis支持五种数据类型

  • string(字符串)
  • hash(哈希)
  • list(列表)
  • set(集合)
  • zset(sorted set:有序集合)

基本使用

key操作

  • keys pattern : 查看键,支持正则
  • keys *: 查看所有键
  • exists key : 查看键是否存在,存在返回1,不存在返回0
  • type key : 查看键对应的value的类型
  • del key1 [key2] : 删除键及对应的值
  • ttl key:以秒为单位,返回给定 key 的剩余生存时间
  • PTTL key:以毫秒为单位返回 key 的剩余生存时间

string字符串

string 是 redis 最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。可以存储JSON化的对象、字节数组等。一个字符串类型键允许存储的数据最大容量是512MB。

常用命令

  • set key value : 保存键和值
  • get key : 获取键对应的值,不存在返回bil
  • setex key seconds value : 设置键值,及其对应的过期时间,单位为s
  • setnx key value 设置键的值,仅当键不存在时
  • getset key value 设置键的字符串值并返回其旧值
  • ttl key : 查看键还有多久过期
  • mset key1 value1 key2 value2 : 设置多个键及其对应的值
  • msetnx key1 value1 key2 value2 : 设置多个键及其对应的值,仅当键不存在时
  • mget key1 key2 : 获取多个键的值
  • append key value : 追加键值

hash哈希

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 2**32 - 1 键值对(40多亿)。

常用命令

  • hset key field value : 设置单个属性及其对应的值
  • hmset key field1 value1 field2 value2 : 设置多个属性及其对应的值
  • hkeys key : 获取指定键的所有属性
  • hget key field : 获取一个属性的值
  • hmget key field1 field2 : 获取多个属性的值
  • hvals key : 获取所有属性的值
  • hdel key field1 field2 : 删除属性,属性对应的值会一起被删除

list列表

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 2**32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

常用命令

  • lpush key value1 value2 : 从左侧增加插入数据
  • rpush key value1 value2 : 从右侧增加插入数据
  • linsert key before value new_value : 在指定的value前插入值新值(new_value)
  • linsert key after value new_value : 在指定的value后插入新值(new_value)
  • lrange key start stop : 获取key的角标从start到stop的值
  • lrange key 0 -1 : 获取key的列表中所有值(角标操作和列表相同)
  • lset key index value : 设置指定索引位置的元素值
  • lrem key count value : 将列表中出现count次的value移除

其中,count > 0表示从头开始移除,count < 0 表示从尾开始移除

set 无序集合

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 2**32 - 1 (4294967295, 每个集合可存储40多亿个成员)。

常用命令

  • sadd key member1 member2 : 添加元素
  • smembers key : 获取所有元素
  • spop key : 移除并返回集合中的一个随机元素
  • srem key : 删除元素
  • scard key : 获取集合的成员数

zset 有序集合

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 2**32 - 1 (4294967295, 每个集合可存储40多亿个成员)。
常用命令

  • zadd key score1 member1 [score2 member2] : 添加元素
  • zadd key : 获取有序集合的成员数
  • zcount key min max 计算在有序集合中指定区间分数的成员数
  • zrange key start stop : 获取元素,操作同python中的set
  • zrangebyscore key min max : 获取score在min和max间的member
  • zscroe key member : 返回member的score值
  • zrem key member1 member : 删除指定元素
  • zremrangebyscore key min max : 删除score在指定范围的元素
  • zrank key member : 返回有序集合中指定成员的索引

生存时间

redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁

命令:

  • expire key seconds设置过期时间
  • ttl key 查看剩余剩余生存时间

返回值:
大于0的数字:剩余生存时间,单位为秒
-1 : 没有生存时间,永久存储
-2 : 数据已经被删除

  • persist key 清除生存时间

redis事务

Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:

  1. 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  2. 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

一个事务从开始到执行会经历以下三个阶段:

  1. 开始事务。
  2. 命令入队。
  3. 执行事务。

发布、订阅

订阅可以使多个客户端等待同一信息,发布可以使服务端向多个特定客户端发送信息

  • 就像收音机一样,只要收音机调到指定的频道channel,就可以收听到电台的信息
  • 而电台可以向所有收听它的收音机发送信息
  • 新的用户,不会收听到之前的消息

订阅频道

  • psubscirbe pattern [pattern ...]:客户端订阅一个或多个符合给定模式的频道
  • subscirbe channel [channel ...]:订阅给定的一个或多个频道的信息。
  • 【上述两个的区别就是pattern可以模式匹配】

发送消息
publish channel message:将信息 message 发送到指定的频道 channel 。返回值是收到message的订阅者数量

退订频道

  • unpsubscirbe [channel [channel ...]]:指示客户端退订给定的频道。
  • punsubscirbe [pattern [pattern ...]]:指示客户端退订所有给定模式。
  • 【上述两个的区别就是pattern可以模式匹配】

频道查询:

  • pubsub numpat:客户端订阅的所有模式的数量总和。
  • pubsub channels [pattern]:列出当前的活跃频道。活跃频道指的是那些至少有一个订阅者的频道, 订阅模式的客户端不计算在内。
  • pubsub numsub [channel­1 ... channel­N]:返回给定频道的订阅者数量, 订阅模式的客户端不计算在内。

事务命令

  • DISCARD取消事务,放弃执行事务块内的所有命令。
  • EXEC 执行所有事务块内的命令。
  • MULTI 标记一个事务块的开始。
  • UNWATCH 取消 WATCH 命令对所有 key 的监视。
  • WATCH key [key …] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

redis主从概念

  • 一个master可以拥有多个slave,一个slave也可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构
  • master用来写数据,slave用来读数据,经统计:网站的读写比率是10:1
  • 通过主从配置可以实现读写分离
  • master和slave都是一个redis实例(redis服务)

在这里插入图片描述

修改配置:

首先修改主的配置文件:etc/redis/redis.conf

1sudo vi redis.conf 2bind 192.168.xxx.xxx 3 4

然后重启redis服务:

1sudo service redis stop 2redis-server redis.conf 3 4

然后配置从
复制etc/redis/redis.conf文件

1sudo cp redis.conf ./slave.conf 2 3

修改redis/slave.conf文件
编辑内容:

1bind 192.168.xxx.xxx 2slaveof 192.168.xxx.xxx 6379 3 4

然后启动服务:

1sudo redis-server slave.conf 2 3

使用:

1redis-cli -h 192.168.xxx.xxx info Replication 2 3

查看主从关系

代码交流 2021