• 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)

     

          

      

  • 相关阅读:
    iOS 字符串遍历
    ImageView通过matrix实现手势缩放,放大,缩小 ,移动
    Xcode 清理存储空间
    iOS学习之字符串(NSString)的截取、匹配、分隔
    convertRect:toView: 和 convertRect:fromView:方法浅析
    社区团购很火爆,影响到小城市菜市场水果店的生意了
    工业级推荐系统 思维导图
    RecBole推荐系统思维导图
    Flink + 强化学习搭建实时推荐系统 思维导图
    传统开源推荐系统介绍思维导图
  • 原文地址:https://www.cnblogs.com/nuochengze/p/12835560.html
Copyright © 2020-2023  润新知