redis的使用

简介

这里写图片描述

一、为什么使用

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

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

关系型数据库的扩展性不强,难以改变表结构

二、优点:

nosql数据库没有关联关系,数据结构简单,拓展表比较容易

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

三、适用场景:

数据高并发的读写

海量数据的读写

对扩展性要求高的数据

四、不适场景:

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

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

五、Redis结构:

Redis是一个开源的key—value型数据库,支持string、list、set、zset和hash类型数据。对这些数据的操作都是原子性的,redus为了保证效率会定期持久化数据。

六、使用场景:

配合关系型数据库做高速缓存

缓存高频次访问的数据,降低数据库io

分布式架构,做session共享

可以持久化特定数据。

利用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数据类型:String set list hash zset

九。基本操作

1.0开启服务

在redis目录下的cmd窗口执行

redis-server.exe redis.windows.conf

开启redis服务,监听6379端口

2.执行指令(增删改查)

再开一个窗口同样在redis目录下,如果设置了环境变量就直接运行

redis-cli

启动客户端口 再输入auth 密码 或者在上面的代码后面加 -a 密码就可以直接进入客户端了
验证是否成功:执行指令

ping

返回 PONG则完成

注意操作前先选定使用哪个库

seclect num

更多操作命令和释义可以参考:http://redis.cn/commands.html

@字符串的操作

set name bill //设置键值
setex name 20 bill //键值20秒后过期   --ttl name方法可以查看值还剩余多少秒才会过期
mset age 60 gender male //一次性存储多个键值
get name //不存在则返回null (获取该key的value)  
mget name age //一次性拿取多个键值 (查看多个value)
incr/decr age //将age加减1
incrby/decrby age 20 //将age加减20
append name gates //向原有value追加内容
strlen key //获取值长度

@key键操作举例

  • 单键多值
  • Redis列表是简单的字符串列表,从左或者从右插入

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

keys * //显示所有键,慎用,数据量大时导致卡死
keys a* // 显示所有以a开头的键
exists name age //判断name和age这两个键存在几个
type name //查看值的类型
del name age //删除键
expire name 30 //name键值30秒过期
ttl name //查看键值的过期时间(-2表示已经过去   -1是永久存在)
persist name // 取消键的过期时间
rename name nickname // 重命名键(这样做不安全,容易覆盖已有数据)
renamenx name nickname // 确保不会覆盖其它键才重命名(nx=not exists,x后缀=exists)

@哈希hash操作举例

  • hash是将多个字段和值存储在一个键中,类似对象
  • 键值对集合,类似map<String,Object>
hset p1 name bill // 设置p1对象的name为bill
hset p1 age 18 // 设置p1对象的age为18
hmset p2 name jobs age -1 //设置p2对象的name为jobs,age为-1
hget p1 name // 获取p1的name属性值
hmget p1 name age // 同时获取p1的name和age
hgetall p1 // 获取p1的全部字段和值
hkeys p1 // 获取p1的全部字段
hvals p1 // 获取p1的全部字段值
hlen p1 // 获取p1中所有字段数(键值对的个数)
hexists p1 name // 判断p1中是否有name字段
hdel p1 name // 删除p1中的name字段
hdel p2 name age // 删除p2中的name和age字段
hstrlen p1 age // p1中的age的长度

@列表list操作举例

  • 在redis中也称队列,可按下标获取元素,也可从头尾弹出或放入
  • 单键多值
  • Redis列表是简单的字符串列表,从左或者从右插入
  • 底层是双向链表,对两端的操作性能很高,通过下标查询性能很低

       `lpush mlist 2 // 从左侧向列表mlist追加元素2
        rpush mlist 3 // 从右侧向列表mlist追加元素3
        linsert mlist after 3 4 // 在列表mlist中3的后边追加元素4
        lset mlist 1 200 // 设置列表mlist中的第1个元素为200(下标从0开始)
        lrange mlist 0 3 // 查看列表mlist中下标[0到3]的元素
        lrange mlist 0 -1 //从头看到尾
        lpop mlist // 从列表左侧弹出一个值
        rpop mlist // 从列表右侧弹出一个值
        ltrim mlist 0 1 // 修剪掉mlist下标[0,1]以外的元素
        llen mlist // 列表元素个数
        lindex mlist 0 // 获取mlist中下标0的元素
        `
    

@集合set操作举例

  • 无序元素集,经常用于求交集、并集、差集等;
  • 类似list的无序集合,保证列表中不会有重复数据,底层是一个value为null的hash表
sadd mset 1 2 3 4 // 向集合mset中添加元素1,2,3,4
smembers mset // 查看集合mset中的元素
scard mset // 查询集合元素个数
sinter mset mset2 //求mset和mset2的交集
sdiff mset mset2 //求mset相比mset2的差集(mset有而mset2无的部分)
sunion mset mset2 // 求mset和mset2的并集
sismember mset 3 //判断3是否是mset中的元素

@有序集合zset

  • 可按权重对元素进行排列;
  • 与set集合非常相似,每个成员都关联了score,可以用来排序
zadd mzset 10 bill 9 jobs 6 jackma // 添加多个值及相应权重
zrange mzset 0 -1 // 返回第一个到最后一个之间所有的元素,按权重升序排列
zcard mzset // 元素个数
zcount mzset 6 10 // 权重6-10之间的元素个数
zscore mzset jackma // 返回 jackma在mzset中的权重

十、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设置节点失联时间,超多该时间(毫秒),集群自动进入主从切换

转载自https://blog.csdn.net/u010986776/article/details/79796203
还有https://blog.csdn.net/u011277123/article/details/78692603

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章