首页 > 编程知识 正文

redis是干嘛的,redis用在哪些方面

时间:2023-05-06 15:04:59 阅读:26036 作者:3428

专注于JavaWeb开发2017-11-22 10:10:36 Redis

一、为什么要用

解决APP应用服务器的cpu和内存压力

减少io读取操作,减轻io压力

关系数据库的可扩展性不强,很难更改表结构

二、好处:

nosql数据库不相关,数据结构简单,易于扩展表

nosql读取速度快,比大数据处理速度快

三、适用场景:

数据高并发的读写

海量数据的读写

对扩展性要求高的数据

四.令人不快的场景:

需要事务支持(非关系数据库)

基于sql结构化查询存储的复杂关系

五、Redis结构:

Redis是一个开放源代码的key—value类型数据库,支持字符串、列表、集、zset和混列类型数据。 对这些数据的操作都是原子性的,redus定期持久化数据以保证效率。

六、使用场景:

与关系数据库的缓存

缓存频繁访问的数据,减少数据库I/o

分布式体系结构,会话共享

可以持久化特定数据。

使用zset类型可以保存排名

利用list的自然时间排序保存最新的n个数据

七.在Linux上redis :

redis目录: usr/local/bin

linux上的redis常规命令:

redis-benchmark :性能测试工具

redis-server :启动redis服务器

redis-CLI :启动redis客户端,操作门户

八. Redis基础知识

端口: 6379

默认16个数据库,下标从0开始

单线程:redis是单线程+io多路复用:检查文件描述的就绪状态

Memchached:多线程+锁

redis数据类型:字符串集列表散列zset

九、Redis命令:

key操作

keys *查看当前库中的所有密钥exists密钥,以确定是否存在要删除密钥expire密钥second的密钥。 密钥过期时间的单位为s秒TTL密钥,过期时间还需要几秒钟。 -1表示过期未过期,-2表示过期。 move key db将密钥移动到另一个库下的dbsize中,以清除显示数据库key的数闪存db。旧库闪存所有ll将杀害所有库String类型。 String是二进制安全的,可以包含任何数据源,最长512米

get key通过引用相应的键值set key value添加键值。 append key value将指定的value添加到原始值末尾的strlen key中以获取值的长度。 如果setNXkeyvaluekey不存在,请设置key值incr key,并将存储在key中的数字加1。 如果为空,则如果值为1decr key,则从key中存储的数字中减去1。 如果值为空,则值以-1incrby/decrby key步长在字符串批处理中增加或减少key数字。

mset key1 value1 key2 value2同时设置多个键值为mget key1 key 2同时获取多个值msetnx key1 value1 key2 value2特定key具有与获取范围密钥开始停止类似的sunstringstrangsetrance 对于不存在密钥星的t stop,sunstring将复盖原始值setex key的到期值value并设置关键值,同时指定和更换到期值getset key value,在设置新值的同时获取旧值List :链表

1、特点:

单键多值

Redis列表是一个简单的字符串列表,从左或右插入

底层

是双向链表,对两端的操作性能很高,通过下标查询性能很低

lpush/rpush <key> <value1> <value2> ..从左或从右插入多个值lpop/rpop <key>从左边或右边吐出一个值,值光键亡rpoplpush <key1> <key2>从key1 右边吐出一个值到key2的左边lrange <key> <index>按照索引下标获取元素 从左到右lindex <key> <index>按照索引下标获取元素 从左到右llen <key> 获取列表长度获取列表长度linsert <key> before <value> <newvalue>在key中value前插入newvalue

Set:类似list的无序集合,保证列表中不会有重复数据,底层是一个value为null的hash表

sadd <key> <value1> <value2>将多个元素加入到key中,重复值忽略smembers <key>取出该集合的所有值sismember <key> <value>判断集合key中是否有该value值 有就1 没有0scard <key>返回该集合的元素个数srem <key> <value1> <value2>删除集合中的某个元素spop <key>随机吐出该集合一个值srandmember <key> <n>随机从集合中取出n个值,不会从集合中删除smove <key1> <key2> <value>将key1中的value 移动到key2 中sinter <key1> <key2>返回两个集合的交集元素sunion <key1> <key2>返回两个集合的并集

hash:键值对集合,类似map<String,Object>

hset <key> <filed> <value>给key 集合中的file 键赋值valuehget <key1> <field>从key1 集合file取出valuehmset <key1> <field1> <value1> <field2> <value2>批量设置hash的值hexists <key> <field>查看key中的field 是否存在hkeys <key>列出key中所有的filedhvals <key>列出该hash集合中所有的value

zset:与set集合非常相似,每个成员都关联了score,可以用来排序

zadd<key><score1><value1><score2><value2>将一个或多个元素以及score加入zsetzrange<key><start><stop> withscore返回下标在区间内的集合,带有scorezrangebyscore <ket> <min> <max>[withscore] [limit offset count]返回key中 score介于min和max中的成员,升序排列zrevrangerbyscore <key> <min> <max> [withscore] [limit offset count]降序zincrby <key> <increment> <value>在key集合中的value上增加incrementzrem <key> <value>删除key集合下的指定元素zcount <key> <min><max>统计 区间内的元素个数zcord <key>获取集合中的元素个数zrank <key><value>查询value在key中的排名,从0开始

十、redis持久化:

两种方式:rdb(redis database)和aof(append of file)

RDB:在指定时间间隔内,将内存中的数据作为一个快照文件(snapshot)写入到磁盘,读取的时候也是直接读取snapshot文件到内存中

①持久化过程:redis单独创建(fork)一个进程来持久化,会先将数据写入临时文件中,待上次持久化结束后,会将该临时文件替换上次持久化文件,比aof高效,但是最后一次数据可能会丢失

②Fork:在linux中,fork()会产生一个跟主进程一样的子进程,出于效率考虑,主进程和子进程会公用一段物理内存,当发生改变的时候,才会把主进程“”写时复制”一份给子进程

③Redis备份的文件:在redis.conf中设置,dbfilename默认为:dump.rdb

④ Rdb保存策略:


900s 1 file change

300s 10file change

60s 10000file change


⑤Rdb的备份:


config get dir 得到备份的文件夹

复制备份文件


⑥Rdb恢复:


关闭redis

将备份文件复制到工作目录下

启动redis,自动加载


AOF : 以日志形式记录每个写操作,启动时通过日志恢复操作

开启AOF:默认不开启,进入redis.conf找到appendonly yes打开

修复AOF:redis-check-aof –fix appendonly.aof

同步频率:每秒记录一次,如果宕机该秒记可能失效

Rewrite:bgrewriteaof 因为日志是追加方式,文件会越来越大,当超过了设置的阈值时,日志文件会压缩,保留仅可以恢复的日志


RDB和AOF对比


节省磁盘空间

恢复速度快

RDB优点:


ROD缺点:


数据太大时,比较消耗性能

一段时间保存一次快照,宕机时最后一次可能没有保存



c) AOF优点:

i. 备份机制更加稳健

ii. 可读的日志文件,通过aof恢复更加稳健,可以处理失误

d) AOF缺点:

i. 比RDB更占磁盘

ii. 备份速度较慢

iii每次都同步日志,有性能压力


RDB和AOF哪个好

官方推荐都启用

对数据不敏感,单独用RDB

不建议单独使用AOF

若作为纯缓存使用,可以都不开启


十一、Redis事务:输入multi,输入的命令都会依次进入到队列中,但不会执行,直到输入exec,redis会将之前命令队列中的命令依次执行,通过discard可以放弃组队。

主要作用:序列化操作,串联多个命令防止别的命令插队

悲观锁:每次拿到数据的时候都会上锁,或者等待别人处理完再去拿锁,传统的关系型数据库里边很多用到了这种锁机制,比如行锁、表锁、读锁、写锁

乐观锁:每次拿数据的时候总认为别人不会修改数据,所以不会上锁。但是更新的时候回去判断别人有没有更改数据,使用版本号机制。乐观锁适用于多读的应用类型,可以提高吞吐量。

Redis使用乐观锁:redis就是利用check-and-set机制实现事务

三大特性:

单独的隔离操作:事务中的所有命令都会序列化,按顺序执行。不会被其他客户端打断

没有隔离级别概念:队列中的命令没有提交之前不会被执行,事务外不能查看事务内的更新

不能保证原子性:跳过错误,依旧执行,没有回滚


十二、Redis订阅/发布:

是进程中的一种消息通信模式,发送者pub发送消息,订阅者sub接收消息 剩下的略。。。

十三、Redis主从复制:

是什么:主从复制就是主机数据更新后根据配置和策略,自动同步到备份机的master/slaver机制,master写为主,slave读为主

用处:

读写分离,性能拓展。

容灾快速恢复


配置服务器(配从不配主):

拷贝多个redis.conf文件

开启daemonize yes

Pid文件名字

指定端口

Log文件名字

Dump.rdb名字

Appendonly 关掉或者换名字


十四、Jedis:

所需jar包:

common-pool-1.6jar包

jedis-2.1


获取jedis对象:Jedis jedis = new Jedis(“ip” ,端口号);

十五、集群分布:

实现对redis的水平拓展,启动n’的redis节点,将整个数据分布在这n个节点中

配置conf文件:

拷贝多个redis.conf文件

开启daemonize yes

Pid文件名字

指定端口

Log文件名字

Dump.rdb名字

Appendonly 关掉或者换名字


配置cluster文件:

cluster-enable yes 打开集群模式

cluster-config-file xxx.conf 设置生成的节点配置文件名

cluster-node-timeout 15000设置节点失联时间,超多该时间(毫秒),集群自动进入主从切换


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。