zoukankan      html  css  js  c++  java
  • Redis概念及基本操作

    一、概述

      redis是一种nosql数据库(非关系型数据库),他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(string,list列表[队列和栈],set[集合],sorted set[有序集合],hash(hash表))。相关参考文档:http://redisdoc.com/index.html

      Redis和关系型数据库是配合使用的,是对关系型数据库的有效补充

    Redis的持久化

      Redis持久化会在磁盘上依赖两个文件(数据文件:rdb;日志文件:aof)

      redis实现持久化两种机制:RDB(周期的将内存中的数据备份到磁盘);AOF(借助于一个日志文件,这个文件会记录每次操作)

    Redis中的数据类型

      字符类型、列表类型、有序集合类型、无序集合类型、哈希表类型

    二、Redis使用场景

    1、登录会话存储:存储在redis中,与memcached相比,数据不会丢失。(session共享、会话保持)
    2、排行版/计数器:比如一些秀场类的项目,经常会有一些前多少名的主播排名。还有一些文章阅读量的技术,或者新浪微博的点赞数等。
    3、作为消息队列:比如celery就是使用redis作为中间人。
    4、当前在线人数:还是之前的秀场例子,会显示当前系统有多少在线人数。
    5、一些常用的数据缓存:比如我们的BBS论坛,板块不会经常变化的,但是每次访问首页都要从mysql中获取,可以在redis中缓存起来,不用每次请求数据库。
    6、把前200篇文章缓存或者评论缓存:一般用户浏览网站,只会浏览前面一部分文章或者评论,那么可以把前面200篇文章和对应的评论缓存起来。用户访问超过的,就访问数据库,并且以后文章超过200篇,则把之前的文章删除。
    7、好友关系:微博的好友关系使用redis实现。
    8、发布和订阅功能:可以用来做聊天软件

    三、Redis和memcached的比较:

     memcachedredis
    类型 纯内存数据库 内存磁盘同步数据库
    数据类型 在定义value时就要固定数据类型 不需要
    虚拟内存 不支持 支持
    过期策略 支持 支持
    存储数据安全 不支持 可以将数据同步到dump.db中
    灾难恢复 不支持 可以将磁盘中的数据恢复到内存中
    分布式 支持 主从同步
    订阅与发布 不支持 支持

    四、Redis的安装

    1、yum

    直接使用yum即可进行安装

    1
    yum install redis -y
    1
    2
    [root@bi6 ~]# yum list |grep redis
    redis.x86_64                               3.2.12-2.el7                base

    使用yum安装的Redis版本是3.2的,如果想安装最新的版本要在Redis官网下载:https://redis.io

    2、编译安装

    复制代码
    wget http://download.redis.io/releases/redis-5.0.0.tar.gz
    tar -zxvf redis-5.0.0.tar.gz
    yum install gcc
    yum install gcc-c++
    make
    cp src/redis-server /usr/bin/
    cp src/redis-cli /usr/bin/
    复制代码

    五、Redis日常操作

    1、启动命令

    systemctl restart redis  
    [root@bi6 redis-5.0.0]# redis-server redis.conf  #编译安装

    2、停止命令

    service redis stop / systemctl stop redis
    redis-cli shutdown 

    3、连接命令

    redis-cli -h 127.0.0.1 -p 6379

    4、切换数据库(默认在0库)

    select 2

    5、配置文件参数

    复制代码
    bind 127.0.0.1                            #对外提供链接的地址
    port 6379                                #默认端口号
    daemonize no                            #守护进程(如果是yes后台运行)应该改为yes
    databases 16                            #(redis数据库用0,1,2,3....代表,最大255)
    save 900 1                                #每900秒有1次增删改操作就同步到磁盘当中
    dbfilename dump.rdb                        #rdb备份方式的文件名字(默认开启)
    dir ./                                    #备份文件存放位置
    appendonly no                            #aof备份是否开启(默认不开启)
    appendfilename "appendonly.aof"            #aof备份文件名称
    appendfsync everysec|always|no            #aof同步机制,每秒同步到磁盘当中(no 表示不负责同步,将同步任务交给文件系统,差不多半个小时同步一次)
    rdbcompression yes                        #rdb默认为压缩
    timeout 300                                #当客户端闲置多长时间后关闭连接,如果指定为 0,表示关闭该功能
    loglevel notice                            #指定日志记录级别,Redis 总共支持四个级别:debug、verbose、notice、warning,默认为 notice
    复制代码

    6、启用Redis的认证功能

    第一步:登录Redis并创建几个字符串并提出

    [root@bi6 redis-5.0.0]# redis-cli -h 127.0.0.1 -p 6379
    127.0.0.1:6379> get name
    "ryzzzz"
    127.0.0.1:6379> exit

    第二步:修改Redis配置文件(启动protect-mode,并添加一行requirepass及密码)

    [root@bi6 redis-5.0.0]# vim redis.conf
    88 protected-mode yes
    89 requirepass 123456

    第三步:重启Redis

    [root@bi6 redis-5.0.0]# redis-cli shutdown
    [root@bi6 redis-5.0.0]# redis-server redis.conf 

    第四步:登录Redis(可以正常登录,但是无法查看原有的内容了)

    [root@bi6 redis-5.0.0]# redis-cli -h 127.0.0.1 -p 6379
    127.0.0.1:6379> get name
    (error) NOAUTH Authentication required.

    第五步:验证登录(使用auth加上配置文件中定义的密码即可进行验证,再次登录后就可以查看原来的内容)

    127.0.0.1:6379> auth 123456
    OK
    127.0.0.1:6379> get name
    "ryzzzz"

    7、Redis的消息模式

      发布订阅(pub/sub)是一种消息通信模式,主要目的是解除消息发布者和消息订阅者之间的耦合。redis作为一个pub/sub的server,在订阅者和发布者之间启动了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型。redis将信息类型成为通道(channel).当发布者通过publish命令向redis server 发送特定类型的信息时,订阅该信息类型的全部client都会受到此消息。

    订阅的基本格式:

    SUBSCRIBE channel [channel ...]    #订阅给定的一个或多个频道的信息

    发送消息的基本格式:

    PUBLISH channel message    #将信息 message 发送到指定的频道 channel 

    第一步:xshell开启两个窗口,并都登录Redis

    [root@bi6 redis-5.0.0]# redis-cli -h 127.0.0.1 -p 6379
    127.0.0.1:6379> auth 123456
    OK

    第二步:先在一个窗口订阅频道

    127.0.0.1:6379> subscribe news
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "news"

    第三步:后在另一个窗口中的同一频道发布内容

    127.0.0.1:6379> publish news "my name is ryz"
    (integer) 1
    127.0.0.1:6379> publish news "welcome to my homepage"
    (integer) 1

    第四步:在第一个窗口查看(可以接收到订阅频道的信息)

    复制代码
    127.0.0.1:6379> subscribe news
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "news"
    3) (integer) 1
    1) "message"
    2) "news"
    3) "my name is ryz"
    1) "message"
    2) "news"
    3) "welcome to my homepage"
    复制代码

    8、字符类型

    复制代码
    1. 添加:set key value     #将字符串值 value 关联到 key 
      set age 23
    
    2. 查看字符串对应的值:get key    #返回 key 所关联的字符串值。
      get age
    
    3. APPEND key value    #将 value 追加到 key 原来的值的末尾
      append age bi
    
    4. MSET key value [key value ...]    #同时设置一个或多个 key-value 对
      mset addr jiangsu tel 123 gender male
    
    5. MGET key [key ...]   #返回所有(一个或多个)给定 key 的值
      mget addr tel gender
    
    6. INCR key  #将 key 中储存的数字值增一
      incr num
    
    7. DECR key   #将 key 中储存的数字值减一
      decr num
    
    8. STRLEN key  #返回 key 所储存的字符串值的长度
      strlen tel
    
    9. DEL key [key ...]  #删除给定的一个或多个 key
      del age num
    
    10. 设置过期时间
        set key value EX timeout
        或:
        setex key timeout value
    11. 查看过期时间
        ttl key
          如:
        ttl username
    12. 查看当前redis所有的key
        keys *
    复制代码

    9、列表(list)

    复制代码
    1. 在列表左边添加一个或多个元素(表头):LPUSH key value [value ...]
        lpush key value
    
    2. 在列表右边添加一个或多个元素(表尾):RPUSH key value [value ...] 
        rpush key value
    
    3. 查看列表中的元素:LRANGE key start stop#返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定
        lrange key 0 10
    
    4. 移除并返回列表key的头元素:
        lpop key
    
    5. 移除并返回列表的尾元素:
        rpop key
    
    6. 指定返回第几个元素:
        lindex key index
    
    7. 获取列表中的元素个数:
        llen key
        如:
        llen languages
    
    8. 删除指定的元素:
        lrem key count value
        如:
        lrem languages 0 php
    根据参数 count 的值,移除列表中与参数 value 相等的元素。count的值可以是以下几种:
    count > 0:从表头开始向表尾搜索,移除与value相等的元素,数量为count。
    count < 0:从表尾开始向表头搜索,移除与 value相等的元素,数量为count的绝对值。
    count = 0:移除表中所有与value 相等的值。
    复制代码

    10、集合(set)

    复制代码
    1. 添加元素:
      sadd set value1 value2....
      如:
      sadd team xiaotuo datuo
    2. 查看元素:
      smembers set
      如:
      smembers team
    3. 移除元素:
      srem set member...
      如:
      srem team xiaotuo datuo
    4. 查看集合中的元素个数:
      scard set
      如:
      scard team1
    5. 获取多个集合的交集:
      sinter set1 set2
      如:
      sinter team1 team2
    6. 获取多个集合的并集:
      sunion set1 set2
      如:
      sunion team1 team2
    7. 获取多个集合的差集:
       sdiff set1 set2
       如:
       sdiff team1 team2
    复制代码
    复制代码
    #有序集合
    1. ZADD key score member [[score member] [score member] ...]  #将一个或多个 member 元素及其 score 值加入到有序集 key 当中
        zadd ke 9 baidu
    2. ZRANGE key start stop [WITHSCORES] #返回有序集 key 中,指定区间内的成员
        zrange ke 0 9
    3. ZREM key member [member ...] #移除有序集 key 中的一个或多个成员
        zrem ke baidu
    复制代码

    11、哈希(hash)

    复制代码
    1. 添加一个新值:
      hset key field value
      如:
      hset website baidu baidu.com
      将哈希表key中的域field的值设为value。
      如果key不存在,一个新的哈希表被创建并进行 HSET操作。如果域 field已经存在于哈希表中,旧值将被覆盖。
    
    2. 获取哈希中的field对应的值:
      hget key field
      如:
      hget website baidu
    
    3. 删除field中的某个field:
      hdel key field
      如:
      hdel website baidu
    
    4. 获取某个哈希中所有的field和value:
      hgetall key
      如:
      hgetall website
    
    5. 获取某个哈希中所有的field:
      hkeys key
      如:
      hkeys website
    
    6. 获取某个哈希中所有的值:
      hvals key
      如:
      hvals website
    
    7. 判断哈希中是否存在某个field:
      hexists key field
      如:
      hexists website baidu
    
    8. 获取哈希中总共的键值对数量:
      hlen field
      如:
      hlen website
    复制代码

    12、事务(Redis和mysql一样也支持事务)

    Redis事务可以一次执行多个命令,事务具有以下特征:

    (1)隔离操作:事务中的所有命令都会序列化、按顺序地执行,不会被其它命令打扰;

    (2)原子操作:事务中的命令要么全部被执行,要么全部都不执行;

    开启事务:

    multi
    以后执行的所有命令,都在这个事务中执行的。

    执行(提交)事务:

    exec
    会将在multi和exec中的操作一并提交。

    取消(回滚)事务:

    discard
    会将multi后的所有命令取消。

    监视一个或多个key:

    watch key...
    监视一个(或多个)key,如果在事务执行之前这个(或这些) key被其他命令所改动,那么事务将被打断。

    取消所有key的监视:

    unwatch
  • 相关阅读:
    OKHttp使用详解
    spring okhttp3
    HTTPS SSL/TLS协议
    springboot @scheduled 并发
    spring @Scheduled 并发
    CORSFilter 跨域资源访问
    定时任务 spring @Scheduled注解
    spring proxy-target-class
    iOS 适用于Pad上的菜单弹出界面-最简单的一种实现记录
    Mac系统清理、占用空间大、空间不够、查看系统文件大小分布
  • 原文地址:https://www.cnblogs.com/biht/p/11720620.html
Copyright © 2011-2022 走看看