Redis
Redis
- Redis是一种数据库。能够存储数据、管理数据的一种软件。
数据库应用的发展历程
- 单机数据库时代
- 缓存、水平切分时代
- 读写分离时代
- 分表分库时代(集群)
- 关系型数据库:Oracle。mysql。DB2、sqlservcer、…
- 非关系型数据库:彻底改变了底层存储机制。不再采用关系数据模式,而是采用聚合数据结构存储数据。
- redis、mongDB、HBase、…
- Redis是一个用C语言编写、开源的、基于内存运行亦可持久化的、高性能的NoSql数据库,也是当前热门的NoSql数据库之一。
- Redis采用的是K-V模型存储数据。
- Redis中的数据大部分时间都是存储内存中的,适合存储频繁访问、数据量比较小的数据。
Redis的特点
- 支持数据持久化
- 支持多种数据结构
- 支持数据备份
- 安装redis:参考安装手册。
启动Redis服务
1)前台启动:在任何目录下执行 redis-server
2)后台启动:在任何目录下执行redis-server &
3)启动redis服务时,指定配置文件:redis-server redis.conf &
关闭Redis服务
1)通过kill命令:ps -ef|grep redis 查看pid kill -9 pid
2)通过redis-cli shutdown 命令关闭
Redis客户端
- 用来连接redis服务,向redis服务器发送命令,并且显示redis服务处理结果
- redis-cli:redis自带客户端,使用命令redis-cli就可以启动redis的客户端处理
- redis-cli:默认连接127.0.0.1(本机)的6379端口上的redis服务。
- redis-cli -p 端口号:连接127.0.0.1的指定端口上的redis服务。
- redis-cli -h IP地址 -p 端口:连接指定ip主机上的指定端口的redis服务。
退出客户端
- 在客户端执行命令:exit或者quit。
Redis基本知识
- 测试redis服务的性能
- redis-benchmark
- 查看redis服务是否正常运行
- ping 如果正常–pong
- 关闭防火墙
- systemctl stop firewalld
- 查看redis服务器的统计信息
- info 查看redis服务的所有统计信息
- info [信息端] 查看redis服务器的指定的统计信息,如:info Replication
- redis的数据库实例
- 作用类似于mysql的数据库实例,redis的数据库实例只能由redis服务来创建和维护,开发人员不能修改和自行创建数据库实例;默认情况下,redis会自动创建16个数据库实例,并且给这些数据库进行编号,从0开始,一直到15,使用时通过编号来使用数据库;可以通过配置文件,指定redis自动创建的数据库个数;redis的每一个数据库本身占用的存储空间是很少的,所以也不会造成存储空间的太多浪费
- 默认情况下,数据库连接的的是编号是0的数据库实例;可以使用select index切换数据库实例
- 查看当前数据库实例中所有key的数量:dbsize
- 查看当前数据库实例中所有的key:keys *
- 清空数据库实例:flushdb
- 清空所有数据库实例:flushall
- 查看redis中的所有配置信息:config get *
Redis的五种数据结构
- 程序是用来处理数据的,redis是用来存储数据的。程序处理完的数据要存储到redis数据库,不同特点的数据要存储在redis中不同类型的数据结构中。
- java redis
- 字符串 string:单key:单value
- list列表 list:单key:多有序value
- set集合 set:单key:多无序value
- pojo hash:单key:对象(属性:值)
- zset:单key:多有序value
Redis中的操作命令
- redis中有关key的操作命令
- 查看数据中的key
- keys pattern
- |->* :匹配0或者多个字符
- |->?:匹配一个字符
- |->[]:匹配[]中的一个字符
- keys * :查看数据库中所有的key
- keys k*:查看数据库中所有以k开头的key
- keys h*o
- keys h?o
- keys h[abc]llo
- 判断key在数据库中是否存在
- exist key 如果存在,则返回1;不存在返回0
- exist key [key key…]返回值是存在的key的数量
- 移动指定的key到指定的数据库实例
- move key index
- 查看指定key的剩余时间
- |->如果key没有设置生存时间,返回-1
- ttl |->如果key不存在,返回-2
- 设置key的最大生存时间:expire key seconds
- 查看指定key的数据类型:type key
- 重命名key:rename key newkey
- 删除key:del key[key key…] 删除指定的key,返回值是实际删除的key的数量
- 查看数据中的key
- redis中有关string类型数据的操作命令
- 将string类型的数据设置到redis中
- set 键 值
- 从redis中获取string类型的数据
- get 键
- 追加字符串
- append key value
- |->返回追加之后的字符串长度
- |->如果key不存在,则重新创建一个key,并且把value值设为value
- 获取字符串数据的长度
- strlen key
- 将字符串数值进行加1运算
- incr key
- |->返回加1运算之后的数据
- |->如果key不存在,首先设置一个key,值初始化为0,然后进行incr运算
- |->要求key所表示的value必须是数值,否则报错
- 将字符串数值进行减1运算
- decr key
- 将字符串数值进行加offset运算
- incrby key offset
- 将字符串数值进行减offset运算
- decrby key offset
- 获取字符串中的子字符串
- getrange key startIndex endIndex
- 用value覆盖从下标为setrange开始的字符串,能覆盖几个字符就覆盖几个字符
- setrange key startIndex value
- 设置字符串数据的同时,设置它的最大生命周期
- serex key seconds value
- 设置string类型的数据value到redis数据库中,当key不存在时设置成功,否则,放弃设置
- sexnx key value
- 批量设置string类型的数据value到redis数据库中
- mset 键1 值1 键2 值2…
- 批量从redis中获取string类型的数据
- mget 键1 键2 键3…
- 批量设置string类型的数据value到redis数据库中,当所有key都不存在时,设置成功,否则,全部放弃设置
- msetnx 键1 值1 键2 值2…
- 将string类型的数据设置到redis中
- redis中有关list类型数据的操作命令
- 将一个或者多个值依次插入到列表的表头(左侧)
- lpush key value[value value value…]
- 获取指定列表中指定下标区间的元素
- lrange key startIndex endIndex
- 将一个或者多个值依次插入到列表的表尾(右侧)
- rpush key value[value value value…]
- 从指定列表中移除并且返回表头元素
- lpop key
- 从指定列表中移除并且返回表尾元素
- rpop key
- 获取指定列表中指定下标的元素
- lindex key index
- 获取指定列表的长度
- llen key
- 根据count值移除指定列表中某一些(跟value相等)数据
- lrem key count value
- |->count>0
- 从列表左侧移除count个跟value相等的
- |->count<0
- 从列表右侧移除count个跟value相等的
- |->count=0
- 从列表中移除全部跟value相等的
- 将一个或者多个值依次插入到列表的表头(左侧)
- redis中有关set类型数据的操作命令
- 将一个或者多个元素添加到集合中,如果元素已经存在,则会忽略,返回成功加入的元素个数
- sadd key value [value value value…]
- 获取指定集合中所有的元素
- smembers key
- 判断指定元素在指定集合中是否存在
- sismember key member
- 存在返回1
- 不存在返回0
- sismember key member
- 获取指定集合的长度
- scard key
- 移除指定集合中一个或者多个元素
- srem key member[member member member…]
- 不存在的元素忽略
- 返回成功移除的个数
- srem key member[member member member…]
- 随机获取指定集合中的一个元素
- srandmember key [count]
- |->count>0:随机获取的多个元素不能重复
- |->count<0:随机获取的多个元素可能重复
- 从指定集合中随机移除一个或者多个元素
- spop key[count]
- 将指定集合中的指定元素移动到另一个元素
- smove source dest member
- 返回一个集合中有而其他集合中都没有的元素组成新集合
- sdiff key key[key key…]
- 获取所有指定集合中都有的元素组成的新集合
- sinter key key key[key key…]
- 获取所有指定集合中所有的元素组成的新集合
- sunion key key key[key key…]
- 将一个或者多个元素添加到集合中,如果元素已经存在,则会忽略,返回成功加入的元素个数
- redis中有关hash类型数据的操作命令
- 将一个或者多个field-value对设置到哈希表中
- hset key field1 value1[field2 value2…]
- 获取指定哈希表中指定field值
- hget key field
- 批量将多个field-value对设置到哈希表中
- hmset key field1 value1[field2 value2…]
- redis4.0.0已弃用
- 批量获取指定哈希表中指定field值
- hmget key field1[field2…]
- 获取指定哈希表中的所有field和value
- hgetall key
- 获取指定哈希表中删除一个或者多个field
- hdel key field1[field2…]
- 获取指定哈希表中的所有field个数
- hlen key
- 判断获取指定哈希表中是否存在某一个field
- hexists key field
- 获取指定哈希表中的所有field列表
- hkeys key
- 获取指定哈希表中的所有value列表
- hvals key
- 对指定哈希表中指定field值进行整数加法运算
- hincrby key field int
- 对指定哈希表中指定field值进行浮点数加法运算
- hincrbyfloat key field float
- 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在的时候才设置,否则不设置。
- hsetnx key field value
- 将一个或者多个field-value对设置到哈希表中
- redis中有关zset类型数据的操作命令
- 将一个或者多个member及其score值加入有序集合
- zadd key score member
- 获取指定有序集合中指定下标区间的元素
- zrange key startIndex endIndex [withscores]
- 获取指定有序集合中指定分数区间的元素
- zrangebyscore key min max [withscores]
- 删除指定有序集合中一个或者多个元素
- zrem key member[member…]
- 获取指定有序集合中所有元素个数
- zcard key
- 获取指定有序集合中指定分数区间元素个数
- zcount key min max
- 获取指定有序集合中指定的元素的排名
- zrank key member
- 获取指定有序集合中指定的元素的分数
- zscore key member
- 获取指定有序集合中指定的元素的排名(倒序)
- zrevrank key member
- 将一个或者多个member及其score值加入有序集合
小结
redis的配置文件
- 在redis根目录下提供redis.conf配置文件
- 可以配置一些redis服务端运行时的一些参数
- 如果不使用配置文件,那么redis会按照默认的参数运行
- 如果使用配置文件,在启动redis服务时必须指定所使用的配置文件
- redis配置文件中关于网络的配置:
- port:端口号,默认6379
- bind:连接时使用的ip地址,默认可以使用redis服务所在主机上任何一个ip都可以;一般情况下,都会配置一个ip,而且通常是一个真实的ip
- 常规配置
- loglevel:配置日志级别,开发阶段配置debug
- logfile:指定日志文件
- 默认情况下,会将日志信息输出到控制台,可以通过使用logfile配置日志文件,使redis把日志信息输出到指定文件中。
- databases:配置redis服务默认创建的数据库实例个数,默认值16。
- 安全配置
- requirepass
- 配置Redis的访问密码。默认不配置密码。
- 需在protect-mode=no时起作用
- 登录客户端
- redis -cli -h ip -p 6379 -a pwd
- requirepass
Redis持久化
RDB策略
- 在指定时间间隔内,redis服务执行指定次数的写操作,会自动触发一次持久化操作
- 默认的持久化策略
- save :配置持久化策略
- dbfilename:配置redis RDB持久化数据存储的文件
- dir:配置redis RDB持久化文件所在目录
AOF策略
- 采用操作日志来记录进行每一次写操作,每次redis服务启动时,都会重新操作一遍日志中的命令。
- 效率低下。
- appendonly:配置是否开启AOF策略
- appendfilename:配置操作日志文件
小结
- 根据数据的特点决定开启那种持久化策略
- 一般情况下,开启RDB足够了
Redis事务
- 允许把一组redis命令放在一起进行序列化,然后一起执行,保证部分原子性
- multi
- 用来标记一个事务开始
- exec
- 执行事务队列所有命令
- 如果一组命令中,在压入队列过程中正常,但是在执行事务队列命令时发生了错误,则只会影响发生错误的命令,不会影响其他命令的执行,不能够保证事务的原子性
- discard
- 清除所有已经压入队列的命令,并且结束整个事务
- watch
- 监控某一个键,当事务在执行过程中,此键代码的值发生变化,则本事务放弃执行,否则,正常执行
- unwatch
- 放弃监控所有的键
Redis消息的发布与订阅(了解 100%不用 后续使用RabbitMQ等中间件)
- redis客户端订阅频道:消息的发布者往频道上发布消息,所有订阅此频道的客户端都能够接受到消息
- subscribe
- 订阅一个或者多个频道的消息
- publish
- 将消息发布到指定频道
- psubcribe
- 订阅一个或者多个频道的消息,频道名支持通配符
Redis的主从复制
- 主少从多、主写从读、读写分离、主写同步复制到从
- info replication
- 默认情况下,所有的redis服务都是主机,即都能写和读,但是都还没有从机。
- 设置主从关系,设从不设主
- 从机设置:slaveof ip 端口号
- 全量复制:一旦主从关系确定,会自动把主机上已有的数据同步复制到从库
- 增量复制:主机写数据会自动同步到从库
- 主写从读,读写分离
- 从机写数据报错
- 主机宕机
- 从机等待
- 主机恢复
- 一切恢复正常
- 从机宕机
- 主机少一个从机,其他不变
- 从机恢复
- 需要重新设置主从关系
- 否则翻身做龙王,成为大哥(master)
- 从机上位
- 主机宕机、从机等待
- 从机断开原来主从关系(slaveof no one)
- 重新设着主从关系
- 主机恢复、成为空头司令
- 天堂变地狱
- 小结:一台主机配置多台从机,一台从机又可以配置多台从机,从而形成一个庞大的集群结构。减轻一台主机的压力,但是增加了服务间的延迟时间
哨兵模式
- 主机宕机、从机上位的自动版
- 提供哨兵配置文件
- 在redis安装目录下创建配置文件:redis_sentinel.conf
- sentinel monitor dc-redis(哨兵名字) ip port 1
- 指定监控主机ip地址,port端口,得到哨兵的投票数(当哨兵投票数大于或者等于此数时切换主从关系)
- sentinel monitor dc-redis(哨兵名字) ip port 1
- 在redis安装目录下创建配置文件:redis_sentinel.conf
- 启动哨兵服务
- redis-sentinel redis_sentinel.conf
- 主机宕机
- 哨兵程序自动选择从机上位
- 主机恢复
- 自动从属于新的主机
缺点
- Redis主从复制缺点就是延迟
Jedis操作Redis
- IDE使用jedis包