Redis入门

简介:Redis是一个高性能的Key-Value数据库,redis开源,属于内存数据库,它可以用作数据库、缓存和消息中间件,它支持多种类型的数据结构,如字符串,哈希,列表,集合,有序集合等。 

1、安装

  1.1 命令行安装

    `sudo apt install redis-server`

  1.2 命令说明

    `redis-server`  redis服务器

    `redis-cli`  redis命令行客户端

    `redis-benchmark`  redis性能测试工具

    `redis-check-aof`  AOF文件修复工具

    `redis-check-rdb`  RDB文件检索工具

2、配置

  2.1 配置存放位置

    `/etc/redis/redis.conf`

  2.2 核心配置选项

    (1)绑定ip:如果需要远程访问,可将此行`bind 127.0.0.1`注释,或绑定一个真实ip

    (2)端口,默认为6379

    (3)是否以守护进程运行`daemonize yes`

      1)如果以守护进程运行,则不会在命令行阻塞,类似于服务

      2)如果以非守护进程运行,则当前终端将被阻塞

      3)设置为yes表示守护进程运行,设置为no表示非守护进程

      4)推荐设置为yes

    (4)数据文件`dbfilename dump.rdb`

    (5)数据文件存储路径`dir /var/lib/redis`

    (6)日志文件`logfile /var/log/redis/redis-server.log`

    (7)数据库,默认有16个`database 16`

    (8)主从复制,类似于双机备份`slaveof`

  2.3 参考

    https://blog.csdn.net/ljphilp/article/details/52934933

3、客户端和服务端命令

  3.1 客户端命令

    (1)客户端的命令为`redis-cli`

    (2)可以使用help查看帮助文档`redis-cli --help`

    (3)数据库没有名称,默认有16个,通过0-15来表示,连接redis默认选择第一个数据库`select n`

  3.2 服务端命令

    (1)服务端的命令为`redis-server`

    (2)可以使用help查看帮助文档`redis-server --help`

    (3)启动`sudo service redis-server start`

    (4)停止`sudo service redis-server stop`

    (5)重启`sudo service redis restart`

    (6)查看redis服务器进程`ps -ef | grep redis`

    (7)杀死redis服务器`sudo kill -9 pid`

    (8)指定加载的配置文件`sudo redis-server /etc/redis/redis.conf`

4、数据操作

  数据结构:(1)redis是key-value的数据结构,每条数据都是一个键值对

       (2)键的类型是字符串

       (3)键不能重复

  值的类型分为五种:(1)字符串string(2)哈希hash(3)列表list(4)集合set(5)有序集合zset

  数据操作行为:(1)保存(2)修改(3)获取(4)删除

  官方中文文档:http://redis.cn/documentation.html

  4.1 string类型

    字符串类型是redis中最为基础的数据存储类型,它在redis中是二进制安全的,这说明string类型可以接受任何格式的数据,如jepg图像数据或json对象描述信息。

    在redis中字符串类型的value最多可容纳的数据长度是512M。

    4.1.1 保存

      如果设置的键不存在则为添加,如果设置的键已经存在则修改

      (1)设置键值`set key value`

      (2)获取键值`get key`

      (3)设置键值及过期时间,以秒为单位`setex key seconds value`

        例如设置a的值为2,过期时间为4秒`setex a 4 2`

      (4)设置多个键值`mset key1 value1 key2 value2...`

      (5)追加值`append key value`

        

    4.1.2 获取

      (1)获取:根据键获取值`get key`,如果不存在此键则返回`nil`

      (2)根据多个键获取多个值:`mget key1 key2`

    4.1.3 删除

      (1)删除键时会将值删除:`del key`

  4.2 键命令

    查找键,参数支持正则表达式

      语法:`keys pattern`

      (1)查看所有键:`keys *`

      (2)查看名称中包含a的键:`keys a*`

      (3)判断键是否存在,如果存在返回1,不存在返回0:`exists key`

      (4)查看键对应的value的类型:`type key`

      (5)删除键及对应的值:`del key1 key2`

      (6)设置过期时间,以秒为单位,如果没有指定过期时间则一直存在,直到使用DEL移除

        `expire key seconds`

      (7)查看 有效时间,以秒为单位

        `ttl key`

  4.3 hash类型

    (1)hash用于存储对象,对象的结构为属性、值

    (2)值的类型为string

    4.3.1 增加、修改

      (1)设置单个属性:`hset key field value`

      (2)设置多个属性:`hmset key field1 value1 field value2 ...`

    4.3.2 获取

      (1)获取指定键所有的属性:`hkeys key`

      (2)获取一个属性的值:`hget key field`

      (3)获取多个属性的值:`hmget key field1 field2...`

      (4)获取所有属性的值:`hvals key`

    4.3.3 删除

      (1)删除整个hash键及值,使用del命令

      (2)删除属性,属性对应的值会被一起删除:`hdel key field1 field2...`

  4.4 list类型

    (1)列表的元素类型为string

    (2)按照插入顺序排序

    4.4.1 增加

      (1)在左侧插入数据:`lpush key value1 value2...`

      (2)在右侧插入数据:`rpush key value1 value2...`

      (3)在指定元素的前或后插入新元素:`linsert key before或after 现有元素 新元素`

    4.4.2 获取

      返回列表里指定范围内的元素

      (1)start、stop为元素的下表索引

      (2)索引从左侧开始,第一个元素为0

      (3)索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素

      语法:`lrange key start stop`

    4.4.3 设置指定索引位置的元素值

      (1)索引从左侧开始,第一个元素为0

      (2)索引可以是负数,表示尾部开始计数,如-1表示最后一个元素

      语法:`lset key index value`

    4.4.4 删除

      删除指定元素

      (1)将列表中前count次出现的值为value的元素移除

      (2)count>0:从头往尾移除

      (3)count<0:从尾往头移除

      (4)count=0:移除所有

      语法:`lrem key count value`

  4.5 set类型

    (1)无序集合

    (2)元素为string类型

    (3)元素具有唯一性,不重复

    (4)说明:对于集合没有修改操作

    4.5.1 增加

      (1)添加元素:`sadd key member1 member2...`

    4.5.2 获取

      (1)返回所有的元素:`smembers key`

    4.5.3 删除

      (1)删除指定元素:`srem key member`

  4.6 zset类型

    (1)sorted set,有序集合

    (2)元素为string 类型

    (3)元素具有唯一性,不重复

    (4)每个元素都会关联一个double类型的score,表示权重,通过权重将元素从小到大排序

    (5)说明:没有修改操作

    4.6.1 增加

      语法:`zadd key score1 member1 score2 member2...`

    4.6.2 获取

      (1)返回指定范围内的元素

      (2)start、stop为元素的下标索引

      (3)索引从左侧开始,第一个元素为0

      (4)索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素

      语法:`zrange key start stop`

      <1> 返回score值在min和max之间的成员:`zrangebyscore key min max`

      <2> 返回成员member的score值:`zscore key member`

    4.6.3 删除

      (1)删除指定元素:`zrem key member1 member2...`

      (2)删除权重在指定范围的元素:`zremrangebyscore key min max`

5、与python交互

  引入模块:`from redis import *`

  这个模块中提供了StrictRedis对象(Strict严格),⽤于连接redis服务器,并按照不同类型提供 了不同⽅法,进⾏交互操作

  5.1 方法

    5.1.1 StrictRedis对象方法

      通过init创建对象,指定参数host、port与指定的服务器和端⼝连接,host默认为localhost,port默认为6379,db默认为0

      `sr = StrictRedis(host='localhost',prot=6379,db=0)`

      简写为:

      `sr = StrictRedis()`

    5.1.2 string的方法

      (1)set(2)setex(3)mset(4)append(5)get(6)mget

    5.1.3 keys的方法

      (1)exists(2)type)(3)delete(4)expire(5)getrange(6)ttl

    5.1.4 hash的方法

      (1)hset(2)hmset(3)hkeys(4)hget(5)hmget(6)hvals(7)hdel

    5.1.5 list的方法

      (1)lpush(2)rpush(3)linsert(4)lrange(5)lset(6)lrem

    5.1.6 set的方法

      (1)sadd(2)smembers(3)srem

    5.1.7 zset的方法

      (1)zadd(2)zrange(3)zrangebyscore(4)zscore(5)zrem(6)zremrangebyscore

  5.2 与python交互   

# 导入包
from redis import *
# 创建一个StrictRedis对象
sr = StricRedis(host="localhost",prot=6379,db=0)

# 操作

#⽅法set,添加键、值,如果添加成功则返回True,如果添加失败则返回False
result = sr.set("name","python")

# ⽅法get,添加键对应的值,如果键存在则返回对应的值,如果键不存在则返回None
result = sr.get("name")

#⽅法set,如果键已经存在则进⾏修改,如果键不存在则进⾏添加
result = sr.set("name","it")

#⽅法delete,删除键及对应的值,如果删除成功则返回受影响的键数,否则则返 回0
result = sr.delete("name)

#⽅法keys,根据正则表达式获取键
result = sr.keys()

 

6、搭配主从

  6.1 主从概念

    (1)⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构

    (2)master用来写数据,slave用来读数据

    (3)通过主从配置可以实现读写分离

    (4)master和slave都是一个redis实例(redis服务)

    

 

 

   6.2 主从配置

    6.2.1 配置主

      (1)查看当前主机的ip:`ifconfig`

      (2)修改`etc/redis/redis.conf`文件

        `sudo vim /etc/redis/redis.conf`

        

 

 

       (3)重启redis服务

        `sudo service redis-server stop`

        `sudo redis-server redis.conf` #进去redis.conf文件目录输入这条命令

      (4)查看服务启动消息

        `ps aux | grep redis`

    6.2.2 配置从

      (1)复制`/etc/redis/redis.conf`文件

        `sudo cp redis.conf ./slave_redis.conf`

      (2)修改redis/slave_redis.conf文件

        (1)`修改绑定的ip号: bind 192.168.0.105` # 可以绑定本机,绑定本机时从不能和主有相同端口号

        (2)`修改port: port 6378` #本机默认端口号为6379,注意不能重复

        (3)默认注释slaveof,需要按照格式重写slaveof

            

 

 

       (3)启动从的服务

        `sudo redis-server /etc/redis/slave_redis.conf`

       (4)查看redis启动的所有服务

        `ps aux | grep redis`

        

 

 

       (5)查看主从关系

        `redis-cli -h 192.168.0.105 info Replication`

        

 

     6.2.3 数据操作

      (1)在master和slave终端下分别执行info命令

        `redis-cli -h 192.168.0.105 -p 6379`

        `redis-cli -h 192.168.0.105 -p 6379`

      (2)在master终端中写入`set a python`

        

      (3)在slave终端中读数据`get a`

         

 

7、搭建集群

  集群的概念

  集群是一组互相独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户端与集群相互作用时,集群就像是一个独立的服务器。集群配置用于提高可用性和可缩放性。

  

   当请求到来时,首先由负载均衡服务器处理,把请求转发到另外的一台服务器上。

  redis集群

  分类:(1)软件层面(2)硬件层面

  软件层面:只有一台电脑,在这一台电脑上启动了多个redis服务。

  

   硬件层面:存在多台实体的电脑,每台电脑上都启动了一个redis或者多个redis服务。

  

   参考阅读:https://www.cnblogs.com/wuxl360/p/5920330.html

  7.1 配置主服务器

    当前ubuntu机器的ip为:192.168.0.103

    在桌面创建conf文件夹,进入并创建文件7000.conf、7001.conf、7002.conf,三个文件的配置区别在port、pidfile、cluster-config-file三项。

    (1)编辑7000.conf的内容为

port 7000
bind 192.168.0.103
daemonize yes
pidfile 7000.pid
cluster-enabled yes
cluster-config-file 7000_node.conf
cluster-node-timeout 15000
appendonly yes

    (2)编辑7001.conf的内容为

port 7001
bind 192.168.0.103
daemonize yes
pidfile 7001.pid
cluster-enabled yes
cluster-config-file 7001_node.conf
cluster-node-timeout 15000
appendonly yes

    (3)编辑7002.conf的内容为

port 7002
bind 192.168.0.103  
daemonize yes
pidfile 7002.pid
cluster-enabled yes
cluster-config-file 7002_node.conf
cluster-node-timeout 15000
appendonly yes

    (4)使用配置文件启动redis服务

redis-server 7000.conf
redis-server 7001.conf
redis-server 7002.conf

    (5)查看进程

     

   7.2 配置从服务器  

    当前ubuntu机器的ip为:192.168.0.100

    在桌面创建conf文件夹,进入并创建文件7003.conf、7004.conf、7005.conf,三个文件的配置区别在port、pidfile、cluster-config-file三项。

    (1)编辑7003.conf的内容为

port 7003
bind 192.168.0.100
daemonize yes
pidfile 7003.pid
cluster-enabled yes
cluster-config-file 7003_node.conf
cluster-node-timeout 15000
appendonly yes

    (2)编辑7004.conf的内容为

port 7004
bind 192.168.0.100
daemonize yes
pidfile 7004.pid
cluster-enabled yes
cluster-config-file 7004_node.conf
cluster-node-timeout 15000
appendonly yes

    (3)编辑7005.conf的内容为

port 7005
bind 192.168.0.100  
daemonize yes
pidfile 7005.pid
cluster-enabled yes
cluster-config-file 7005_node.conf
cluster-node-timeout 15000
appendonly yes

    (4)使用配置文件启动redis服务

redis-server 7003.conf
redis-server 7004.conf
redis-server 7005.conf

    (5)查看进程

      

  7.3 说明

    参考>>>6.2

  7.4 创建集群

    redis的安装包中包含了redis-trib.rb,用于创建集群

    在主服务器(192.168.0.103)上执行命令:

    (1)复制redis-trib.rb命令到/usr/local/bin/以便在任何目录下都可以调用此命令

      `sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /usr/local/bin/`

    (2)安装ruby环境,redis-trib.rb由ruby开发,运行时需要ruby的支持

      `sudo apt-get install ruby`

    (3)升级ruby,防止版本过旧无法创建集群

      `gem source -l # 查看gem源地址`

      `gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/  # 更换源`

      `sudo gem install redis  # 通过gem安装redis的相关依赖,并升级ruby`

    (4)执行redis-trib.rb命令创建集群

      ` redis-trib.rb create --replicas 1 192.168.0.103:7000 192.168.0.103:7001 192.168.0.103:7002 192.168.0.100:7003 192.168.0.100:7004 192.168.0.100:7005`

    (5)创建时的命令流

      

 

 

       集群搭建成功

  7.5 数据验证

    

    当前搭建的主服务器为7000、7001、7003,对应的从服务器是7005、7004、7002

    在192.168.0.100上连接7002,加参数-c表示连接到集群

    `redis-cli -h 192.168.0.100 -c -p 7002`

    

     当写入数据时,会自动跳转到响应的服务器,并写入数据成功。

  7.6 在服务器上写入数据的规则

    (1)redis cluster在设计的时候,就考虑到了去中⼼化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各⾃的数据和整个集 群的状态。每个节点都和其他所有节点连接,⽽且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意⼀个节点,就可以获取到其他节点的数据

    (2)Redis集群没有并使⽤传统的⼀致性哈希来分配数据,⽽是采⽤另外⼀种叫做哈希槽 (hash slot)的⽅式来分配的。redis cluster 默认分配了 16384 个slot,当我们 set⼀个key 时,会⽤CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测试的时候看到set和get 的时候,直接跳转到了7000端⼝的节点

    (3)Redis 集群会把数据存在⼀个 master 节点,然后在这个 master 和其对应的salve 之间进⾏数据同步。当读取数据时,也根据⼀致性哈希算法到对应的 master 节点获取数据。只有当⼀个master 挂掉之后,才会启动⼀个对应的 salve 节点,充当 master

    (4)需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数⼩于总节点数的⼀半时,整个集群就⽆法提供服务了。

  7.7 与python的交互

    (1)安装包`pip install redis-py-cluster`

    (2)示例文件如下: 

from rediscluster import *
if __name__ == '__main__':
  try:
      # 构建所有的节点,Redis会使⽤CRC16算法,将键和值写到某个节点上
      startup_nodes = [
          {'host': '192.192.0.103', 'port': '7000'},
          {'host': '192.168.0.100', 'port': '7003'},
          {'host': '192.168.0.103', 'port': '7001'},
      ]
      # 构建RedisCluster对象
      src=RedisCluster(startup_nodes=startup_nodes,decode_responses=True)
      # 设置键为name、值为python的数据
      result=src.set('name','python')
      print(result)
      # 获取键为name
      name = src.get('name')
      print(name)
  except Exception as e:
      print(e)

 

 

 

      

  

posted @ 2020-05-06 12:09  Norni  阅读(234)  评论(0编辑  收藏  举报