Redis入门讲解以及应用

Redis(REmote DIctionary Server)

在我们日常的Java Web开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量 的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬 间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问 题。

1. Redis安装和启动

1.在官网下载Redis安装包 本教程是Linux系统的。http://redis.cn
2.tar -zxvf redis的安装包
3.在有gcc环境(gcc -v看是否安装了gcc环境)的下进入redis安装包解压的目录下执行make命令 否则会报错 gcc是C,C++语言开发所需要的环境,没有就通过yum和weget命令下载
4.make 编译成功后,进入src文件夹,执行make install进行Redis安装。
5.复制一份redis默认配置的文件redis.conf(你也可以直接修改redis.conf但建议复制多一分进行配置) 并把里面的general配置中的no改成yes这是redis默认不会以一个守护进程的形式运行 我们需要守护进程形式运行daemonize yes 他就不会出现redis商标在dos命令窗口了
6.在回到redis安装解压的文件目录下,通过redis-server /myredis/redis.conf设置服务器启动根据这个文件下的规定启动和redis-cli -p 6379 规定服务器在这指定的端口下启动
7.进入redis的demo命令窗口我们用ping命令看是否成功启动 回复pong就是成功
8.测试一个简单的demo 使用命令set name lizhijian 再用get name 看是否是lizhijian

9.退出先用shutdown关闭redis,再通过exit退出redis即可

Redis五大数据类型简介

  • 1)String(字符串)
    String 类型是二进制安全的意思就是可包含任何数据,比如jpg图片或者序列化的对象,最多是可以512M

  • 2)Hash(哈希,类似java的Map)
    是一个键值对集合,是一个String 类型的field和value的映射表,hash特别适合存储对象。类似java中的Map<String,Object> 简单来说KV键值对不变 V是一个键值对

  • 3)List(列表)
    是一个简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表头部或者尾部

  • 4)Set(集合)
    是一个String类型无序集合,他是通过HashTable实现的。不允许重复的成员

  • 5)Zset(Sorted Set : 有序集合)
    和Set是一样的,都不允许有重复的成员,区别就是value中有一个score,根据score来排序的集合

Redis的常用命令 (http://redisdoc.com)

  • 1)Redis默认有16个库(在redis.conf里面的general中)从中的注释中可知库的索引是从0开始的 , 可通过 select [index] 下标索引来进行切换库

  • 2)(关于Key的命令)Redis中可使用 dbsize查看当前库中有多少个key值
    再可通过 keys * / 查看当前库中所有键名
    也可通过 keys 查询键名? / 查询前部分匹配的键名
    通过 exists 键名 / 判断是否存在此键名
    通过 move 键名 [index] / [index] 把指定的键名移动(剪切)到指定的下标索引库中
    通过 expire 键名 / 秒钟 给指定的key指定过期时间
    通过 ttl 键名 / 查看还有多少秒过期 -1表示永不过期 -2表示已过期
    通过 type 键名 / 查看当前键名的类型
    通过 del 键名 / 删除当前键
    通过 set 键名 值 / 设置键值对,如果存在当前键,则覆盖了。

  • 3)(关于String的命令)Redis中可使用
    通过 append 键名 / 追加内容 把指定追加内容追加到指定的键值后
    通过 strlen 键名 / 获取当前键值的字符串长度
    通过 incr 键名 / 把指定键值加一(不是数字字符串则会报错) (如果键不存在,则创建一个值为0的键值对)
    通过 decr 键名 / 把指定键值减一(不是数字字符串则会报错) (如果键不存在,则创建一个值为0的键值对)
    通过 incrby 键名 数字 / 把指定键值加上指定数(不是数字字符串则会报错) (如果键不存在,则创建一个值为0的键值对)
    通过 decrby 键名 数字 / 把指定键值减去指定数(不是数字字符串则会报错) (如果键不存在,则创建一个值为0的键值对)
    通过 getrange 键名 开始下标 结束下标 / 获取指定键值的开始下标到结束下标的长度内容 (0,-1)是指全部
    通过 setrange 键名 开始下标 替换内容 / 把指定的键值从开始下标替换到开始下标+替换内容长度的位置替换成替换内容
    通过 setex 键名 过期秒数 键值 / 设置键值对并且赋予生命周期
    通过 setnx 键名 键值 / 如果键名不存在则创建一个新的,存在不覆盖
    通过 mset 键名1 键值1 键名2 键值2 … / 同时设置多个键值对
    通过 mget 键名1 键名2 键名3 … / 同时获得多个键的值
    通过 msetnx 键名1 键值1 键名2 键值2 … / 同时设置多个键值对,键名不存在则创建一个新的,存在不覆盖,如果键名有一个不存在则全部设置失效

  • 4)(关于List的命令)Redis中使用
    通过 lpush 键名 [value…] / 从右向左插入value
    通过 rpush 键名 [value…] / 从左向右插入value
    通过 lrange 键名 [begin] [end] / 从左开始读取下标为begin 到 end的长度的value
    通过 lpop 键名 / 出栈左边(即栈顶)
    通过 rpop 键名 / 出栈右边(即栈末)
    通过 lindex 键名 下标索引 / 显示指定键值list的下标索引的值
    通过 linsert 键名 before/after 关键字 插入内容 / 在指定键名的关键字的前或后插入内容
    通过 llen 键名 / 查看指定键值的长度
    通过 lrem 键名 删除个数 删除关键字名字 / 删除指定键值的多少个个数的关键字名字

  • 5)(关于Hash的命令)Redis中使用
    通过 hset 键名 field1 value1 field2 value2… / 设置键值field为value
    通过 hget 键名 field1 field2… / 得到对应的键值的field
    通过 hgetall 键名 / 得到对应的键值所有的field和value
    通过 hdel 键名 field … / 删除对应键值的field
    通过 hlen 键名 / 获得对应键值有多少个field
    通过 hexists 键名 field / 查看对应的键值有没有field
    通过 hkeys 键名 / 查看对应的键值所有的field
    通过 hvals 键名 / 查看对应的键值所有的value
    通过 hincrby 键名 field num / 使对应的键值的value增加num
    通过 hincrbyfloat 键名 field floatnum / 使对应的键值的value增加flaotnum
    通过 hsetnx 键名 field value / 如果存在就不设置 , 不存在就设置

  • 6)(关于Set的命令)Redis中使用
    通过 sadd 键名 [value…] / 添加多个value创建对应的键值对(不允许有重复,有重复不报错,只是插不进去)
    通过 smembers 键名 / 展示指定键名的所有value
    通过 sismember 键名 关键字 / 查看关键字在指定键值中存不存在 1存在 0不存在
    通过 scard 键名 / 查看指定键值的value个数
    通过 srem 键名 关键字 / 删除指定键名的指定关键字
    通过 srandmember 键名 个数 / 要指定键值随机出 指定个数的 value
    通过 spop 键名 / 随机出栈value
    通过 smove 键名1 键名2 键名1中value / 将键名1中value剪切添加到键名2中
    通过 sdiff 键名1 键名2 / 展示出键名1和键名2的差集
    通过 sinter 键名1 键名2 / 展示出键名1和键名2的交集
    通过 sunion 键名1 键名2 / 展示出键名1和键名2的并集

  • 7)(关于Zset的命令)Redis中使用
    通过 zadd 键名 [score] [value] … / 添加多个value并带上score创建对应的键值对(不允许有重复,有重复不报错,只是插不进去)
    通过 zrange 键名 [begin] [end] [withscores] / 取从begin到end指定键值的value,后面的withscores是否显示score
    通过 zrevrange 键名 [begin] [end] [withscores] / 逆序取从begin到end指定键值的value,后面的withscores是否显示score
    通过 zrangebyscore 键名 num1 num2 [limit] [begin] [num] / 取分数在num1≤x≤num2之间的value,后面的limit限制显示从begin下标开始num条value (‘(num’是不包含)
    通过 zrevrangebyscore 键名 num1 num2 [limit] [begin] [num] / 逆序取分数在num1≤x≤num2(注意从大到小因为逆序排序)之间的value,后面的limit限制显示从begin下标开始num条value
    通过 zrem 键名 value / 删除指定键名的指定value
    通过 zcard 键名 / 统计value的个数
    通过 zcount 键名 num1 num2 / 统计score在num1≤x≤num2之间的个数
    通过 zrank 键名 value / 得到value的索引下标
    通过 zscore 键名 value / 的到对应的value的score的值
    通过 zrevrank 键名 value / 逆序得到value的索引下标
    通过

  • 8)Redis可通过 FLUSHDB 清空当前库的键值对
    FLUSHALL 清空16个库的键值对

Redis的配置文件(redis.conf)

1.配置文件中的Unit单位大小写不敏感,在文件头部也有说明单位之间的转换

2.includes
此包含了其他的配置文件

3.network
–bind 绑定可以访问的ip,没有就是所有都可以访问
–proctected-mode redis的保护模式 是否要开启开启了外面的服务器将访问不到
–tcp-backlog 连接队列
–tcp-keepalive 保持通讯
–loglevel 日志等级
–logfile 日志文件
–Port 端口
–Timeout 连接超时时间,闲置多长时间关闭连接

4.general
–daemonized 是否需要以守护线程方式启动
-pidfile 进程文件目录存放路径
–Logfile 日志文件
–Syslog-enabled 是否把日志输出到syslog中
–Syslog-ident 指定syslog中日志标志
–Syslog-facility 指定syslog设备,值可以是USER或LOCAL0-LOCAL7
–Databases 数据库的数量

5.snapshotting
–dbfilename 指定本地数据库的文件名
–dir / 指定本地数据库的存放的目录
–save 备份策略(save 间隔秒数 更改的数据个数)
–stop-writes-on-bgsave-error 备份数据跟写入数据保持一致,如果写入有错误停止备份
–rdbcompression 备份文件是否压缩 压缩算法是LZF
–rdbchecksum 在存储快照让redis根据CRC64算法进行数据校验

6.appendonlymode
–appendonly 是否开启aof持久备份策略
–appendfilename 备份文件名
–appendfsync 备份策略 (always,everysec,no)分别(每有一个写的记录就立即备份,每一秒进行备份,不备份)
–no-appendfsync-on-rewrite 重写时是否可以运用appendfsync,默认no即可,保证数据安全性
–auto-aof-rewrite-precentage 触发重写的条件设置 设置appendonly.aof文件是上一次rewrite文件大小的百分之多少触发要同时满足下面的条件
–auto-aof-rewrite-size 触发重写条件设置 设置appendonly.aof文件大于这个大小触发要同时满足上面的条件

7.Security
–requirepass foobared 连接Redis是否需要密码,默认关闭
通过config get requirepass 查看当前需不需要密码没有密码的话,可设置密码通过config set requirepass “123456” 设置密码后在使用命令前要先auth 123456登录才可。

8.limits
–Maxclients 最大客户端连接
–Maxmemory 最大内存 到达最大内存将无法写入,但仍可以读取

–Maxmemory-policy 缓存策略
volatile-lru: 使用LRU算法移除key,只对设置了过期时间的键 (lru最近最少使用)
allkey-lru: 使用LRU算法移除所有key
volatile-random: 在过期集合中移除随机的key,只对设置了过期时间的键
allkey-random: 移除随机的key
volatile-ttl: 移除那些TTL值最小的key,即那些最近要过期的key
noeviction: 不进行移除,永不过期

–Maxmemory-samples 设置样本数量,LRU算法和TTL算法都并非是精确的算法,而是估算值,所有你可以设置样本大小,他会先用样本做内部的测试。

Redis持久化之RDB(Redis Data Base)

持久化是什么? 在指定的时间间隔内将内存中的数据集快照写入磁盘
备份:从内存写入磁盘
恢复:从磁盘写入快照
RDB简单来说就是 隔一段时间fork一个进程备份一次到dump.rdb到硬盘中,再恢复备份。
在redis.conf中的snapshot中配置有相关备份策略的配置
可通过命令save或者bgsave备份dump.rdb文件,flushall也会立即备份(save就是前台不要写入数据,先给我备份,而bgsave就是异步进行备份,在前台写入数据同时也进行备份)
最后可通过redis-cli config set save ""或者在redis.conf中配置save ""取消所有策略
当dump.rdb出现问题时可以用命令 redis-check-rdb --fix dump.rdb 修复文件

Redis持久化之AOF(Append Only File)

AOF简单来说就是以日志形式来记录每一个写操作,只允许追加文件不可修改,并保存在硬盘中的appendonly.aof文件中。
redis.conf中的append only mode中有appendolnly no默认是aof关闭状态的
当appendonly.aof出现问题时可以用命令 redis-check-aof --fix appendonly.aof 修复文件

当appendonly.aof越来越大时,就会进行重写机制,对appendonly.aof进行压缩,只保留可恢复数据的最小指令集
也可自己用命令触发 bgrewriteaof 进行压缩
而触发重写的机制条件是 当appendonly.aod文件大小是上次rewrite的一倍且文件大于64M,Redis在重写都会记录文件大小

###RDB和AOF共存问题
两种备份策略同时开启的时候,服务器开启时redis先去找appendonly.aof文件,就是先AOF模式

###Redis事务
Redis事务就是可以一次执行多个命令,本质是一组命令的集合,一个事务中的命令都会被序列化,按顺序的串行化执行而不会被其他命令插入,不许加塞。

multi ----标志着一个事务的开始
exec ----提交执行当前事务(之前加的监控锁都会被取消,不管事务成功还是失败)
discard ----放弃当前事务
watch [key] ----监控一个key,先监控,再事务开始,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断
unwatch ----放弃所有的监控key

当事务里面有编译时错误 就是 事务不成功 全部回滚
当事务里面是运行时错误 就是 不启用事务 错的那条失败 其他成功

补充知识点:
悲观锁 : 每次去拿数据的时候都认为别人会修改,所以每次拿数据的时候都会上锁,这样别人想拿到这个数据就会block直到他拿到锁,比如行锁,表锁。
乐观锁 : 他每次会给更改后的数据一个版本号,只有你要更改提交的数据版本号大于当前版本才能执行成功。

Redis事务的特性
1.单独的隔离操作:一个事务中的命令都会被序列化,按顺序的串行化执行而不会被其他命令插入,不许加塞。
2.没有隔离级别
3.部分支持事务

Redis消息中间件 消息的订阅和发布

subscribe key … ---- 订阅key
publish key message ---- 在指定key发布消息
psubscribe key* ---- 订阅前面是key的所有频道

###Redis主从复制
先配置从节点 再 配置主节点

从节点配置 (只能进行读操作不可进行写操作)
配置redis.conf文件中的配置例如端口,日志文件名,备份文件名
slaveof 主节点IP 主节点端口 手动和主节点进行连接 一连接就会进行主从复制
可通过 info replication 查看redis节点信息
若主节点宕机死了 从节点原地待命等待主机复活再自动连接(若使用slaveof no one使从节点变为主节点)
若本从节点宕机死了 主节点就会断开和这从节点的连接 当这从节点重新开机时 又会变为主节点需要重新连接

主从复制模式有
传统的一主多仆,薪火相传,反客为主
1.一主多仆 一个主节点多个从节点(主节点挂了,从节点原地待命)
2.薪火相传 一个主节点多个从节点从节点下面又有从节点
3.反客为主 一个主节点多个从节点(主节点挂了,从节点接上通过slaveof no one命令变为主节点,其他从节点通过slaveof ip 端口连接这个新的主节点,若之前那个主节点复活,
只是个光杆司令,没有任何从节点连接)

slaveof 连接到主节点后会发送一个sync命令
主节点接到命令后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台的进程执行完毕之后,主节点将整个文件传送到从节点,实现一次 全量复制 :而从节点服务在接受到
数据库文件后,将其存盘并加载到内存中,, 增量复制: 主节点继续将新的所有收集到的修改命令依次传给从节点,完成同步。

哨兵模式(sentinel)
哨兵模式就是反客为主的自动版,如果主节点发生故障,随机投票从从节点中选取作为新的主节点,当之前主节点回来,就变为投票选出的主节点的从节点
需要在创建sentinel.conf文件
sentinel monitor 被监控的主节点的名字(自定义) 主节点ip 主节点端口 挂掉后投票票数大于当前票数才可成为主机
redis-sentinel sentinel.conf文件的目录路径 来启动哨兵(哨兵是监视主节点一挂掉就从从节点中投票选取)

若想知道Java如何操作Redis请继续看我这篇博客

https://blog.csdn.net/weixin_44012722/article/details/105665310






一键查询淘宝/拼多多内部优惠券,每日大额外卖红包,购物省钱的宝藏工具
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值