Redis (四)|基础、事务、持久化

Scroll Down

前言

hello,到这里,今天带来Redis的基础命令,数据结构、事务以及持久化知识点

一、NoSQL概述

为啥需要NoSQL

  • 高并发
  • 海量数据高效存储和访问
  • 高可用性和高拓展性

NoSQL数据库四大类

  • 键值对存储(key-value):内存缓存,主要处理大量数据的高访问负载
    • 优:快速查询
    • 劣:存储数据缺少结构化
    • TokyoCabinet、Redis、Voldemort
  • 列存储:分布式文件系统
    • 优:查询速度快,拓展强,更容易进行分布式拓展
    • 劣:功能相对局限
    • HBase、Riak
  • 文档数据库:web应用(与key-value类似,value是结构化)
    • 优:结构要求不严格
    • 劣:查询性能不高,缺乏统一的查询语法
    • MongoDb、CouchDB
  • 图形数据库:社交网络。推荐系统,专注构建关系图谱
    • 优:利用结构相关算法
    • 劣:需要对整个图做计算才能得出结论,不容易做集群方案
    • Neo4J、InfoGrid

NoSQL特点

  • 容易拓展
  • 灵活数据模型
  • 高可用性
  • 大量数据、高性能

二、Redis概述

用C语言开发的高性能键值对数据库,提供多种数据类型,有字符串、列表、有序集合、集合、散列五种类型

2.1、应用场景

缓存、排行榜、任务队列、网站访问统计、数据过期处理、分布式集群架构中session分离

二、Redis入门

2.1、Key定义规范

  • 不要过过长
  • 不要过短
  • 统一命名规范。PD:AA:aa

2.1、Value介绍

  • String:二进制储存,存入和获取是相同,最大可容纳512M
存:set 键 值;取:get 键
先存后取:getset 键 值
删除:del 键
递增:incr 键 (一定是整数;如无值则赋0后加1)
递键:decr 键 (一定是整数;如无值则赋0后减1)
增指定值:incrby 键 [integer]
减指定值:decrby 键 [integer]
追加字符:append 键 "string"
  • Hash:键值对储存,每个Hash可以储存4294927295个键值对
hset map-name key name
hmset map-name (key name)+  同时设置多个值
hget map-name key
hmget map-name (key)+    同时获取多个值
hgetall map-name  获取一个map中所有的值
hdel  map-name (key)+   删除一个或多个值  返回值:受影响的行数
del map-name     删除map
hincrby map-name key step 按指定步长增加
hexists map-name key    判断非空
hlen map-name  获取长度
hkeys map-name 获取所有的key
hvals map-name 获取所有的值
  • List: 链表,包括双向链表,插入删除数据非常快。可以用于消息中间件的补救措施,比如消息队列中的消息发送成功存入一个链表,发送失败存入一个链表,一段时间后将发送成功的链表清空,发送失败的链表中的消息继续发送,直到成功后存入成功的链表,目的是为了保证数据的一致性。
    • 1.ArrayList使用数组方式:使用索引查询-块,新增删除时涉及位移操作-慢
    • 2.LinkedList使用双向链接方式:每个元素记录前后元素指针
    • 3.双向链表增加数据
    • 4.双向链表删除数据
左插入:lpush 列名 [值..];右插入:rpush 列名 [值..]
查询:lrange 列名 [begin,end](两者可为正负整数,负数则从相反方向计数,正数从0开始,负数从-1开始)
左弹:lpop 列名;右弹:rpop 列名(查出结果均被删除)
数量:llen 列名
已有列左插入:lpushx 列名 [值...];已有列右插入:rpushx 列名 [值...]
移除:lrem 列名 [count] 值 (count可为正负数,负数则从相反方向计数,0为所有值)
指定插入:lset 列名 [index] 值
从前插入:linsert 列名 before [指定值] 值;从后插入:linsert 列名 after [指定值] 值
从列1弹出最后元素插入列2的头部:rpoplpush 列1名 列2名
  • set: 无重复数据的无序集合,可用于统计用户数据,比如购物网站用一个set记录一类商品的购买用户,用另一个set记录另一个商品的购买用户,可以做交集,差集等,分析用户喜好。
存:sadd 列名 [值...]
删:srem 列名 [值...]
查全:smembers 列名
查是否存在:sismember 列名 值,1表示存在,0表示不存在
差集:sdiff 列名1 列名2 (与顺序有关)
交集:sinter 列名1 列名2
并集:sunion 列名1 列名2
查数量:scard 列名
随机查:srandmember 列名
将差集存到新集合中:sdiffstore 新列名 列名1 列名2
将交集存到新集合中:sinterstore 新列名 列名1 列名2
将并集存到新集合中:sunionstore 新列名 列名1 列名2
  • sorted-set: 无重复数据的有序集合,可存入数据和与之对应的分值,根据分值排序,可用于排名统计等
存:zadd 列名 [分数 值]...
查分数:zscore 列名 值
查数量:zcard 列名
单删:zrem 列名 值...;范围删除:zremrangebyrank 列名 [begin,end]
升序查值:zrange 列名 [begin,end] <withscores>(两者可为正负数,负数则从反方向开始计数,正数从0开始,负数从-1开始)(withscores带分数,可选项)
降序查值:zrevrange 列名 [begin,end] <withscores>(两者可为正负数,负数则从反方向开始计数,正数从0开始,负数从-1开始)(withscores带分数,可选项)
分数查值:zrangebyscore 列名 [begin,end] <withscores> 
分页查值:zrangebyscore 列名 [begin,end] <withscores limit [begin,end]>
  • stream(5.0支持)

2.3、Key通用操作

所有键列:keys *
指定开头键列:keys [*]?
删:del 键...
判断存在:exists 键
重命名:rename 旧键名 新键名
设过期时间:expire 键 [seconds]
查过期时间:ttl 键
键的值类型:type 键
清空缓存:flushall

三、Redis特性命令

3.1、特性

  • 每个Redis实例有16个数据库,角标从0~15,默认为0,也可以通过select来选择数据库。比如:select 1,选择1号数据库
    move用于移动数据库。比如:move myset 1,表示移动myset这个key到1号数据库。
  • 开启事务会将任务放到queue中,当提交事务时逐个执行

3.2、事务

  • 切换数据库:select [0~15]
  • 开启事务:multi
  • 提交事务:exec
  • 回滚事务:discard

四、持久化

数据从内存同步到硬盘

4.1、持久化方式

  • RDB持久化:指定的时间内,将内存快照写入到磁盘
  • AOP持久化:日志形式记录每一个操作,服务器启动之初,读取文件,重新构建数据库
  • 无持久化:通过配置禁用redis持久化的功能,这样redis只是一个缓存的工具
  • 同时使用AOF和RDB方式

4.1、RDB

  • 优势
1.数据库只包含一个文件,通过文件备份策略,定期配置,恢复系统灾难
2.压缩文件转移到其他介质上
3.性能最大化,redis开始持久化时,分叉出进程,由子进程完成持久化的工作,避免服务器进程执行I/O操作,启动效率高
4.与AOF相比优势:启动效率更高
  • 劣势
1.想保证数据的高可用性(最大限度避免数据的丢失),那RDB不是一个很好的选择(如果系统在定时持久化之前发生故障,那么数据还没来得及往磁盘上写,数据就已经丢失了)
2.通过fock分叉子进程完成工作,数据集大的时候,服务器需要停止几百毫秒甚至1秒
  • 配置
cd /usr/local/redis
vim redis.conf
默认:
save 900 1 #每900秒至少1个key变化,持久化一次,到内存一个快照
save 300 10 #每300秒至少10个key变化,往硬盘写一次
save 60 10000 #每60秒至少10000个key变化,写一次
dbfilename dump.rdb #数据的文件名
dir ./ #保存的路径,redis路径下

4.2、AOF

  • 优势
1.同步:
    a.每秒同步:异步完成,效率高,一旦系统宕机,修改的数据丢失
    b.每修改同步:同步持久化,每分钟发生的变化记录到磁盘中,效率低,安全
    c.不同步
2.日志写入操作追加模式append
    a.系统宕机,不影响存在的内容
    b.写入一半数据,若系统崩溃,下次启动redis,redis-check-aof工具解决数据一致性
3.如果日志过大,自动重写机制,修改的数据写入到到磁盘文件,创建新文件,记录产生的修改命令,重写切换时,保证数据安全
4.格式清晰的日志文件,完成数据的重建
  • 劣势
1.对于相同数据文件,相比RDB,AOF文件较大
2.效率低
  • 配置
1.	编辑redis.conf:vim redis.conf
2.	找到appendonly 未开启为no 需要改成yes(因为默认使用rdb方式所以) 
3.	Redis的目录下会产生appendonly.aof这个文件,用来保存appendonly的之前的增删改操作,
4.	appendfsync always 没修改一次就同步到磁盘上
5.	appendfsync everysec 每秒会向硬盘中同步一次
6.	appendfsync no 不同步到硬盘中
7.	停掉redis  ./bin/redis-cli shutdown 
8.	重启redis  ./bin/redis-servers ./redis.conf
9.	flushall 清空数据库 , 做缓存使用  
10.	进入appendonly.aof删除flushall可以恢复数据库

其他知识点

redis5.0的12项新的特性

1,新的stram数据类型
2,新增redis模块API:Timers and Cluster API.
3,RDB现在的存储LFU和LRU信息
    RDB = redis database 做数据持久化
    LFU = 最近最少使用淘汰算法
    LRU = 最近不经常使用淘汰算法
4,集群管理器从Ruby(redis-trib.rb) 移植到c代码
5,新sort set命令:ZPOPMIN/MAX和阻塞变种
6,主动碎片整理v2
7,增强HyperLoglog实现
        用估算的算法,节省内存空间
8,更好的内存系统报告
9,许多带有子命令的命令现在都有一个help子命令
10,客户经常连接和断开时性能更好
11,误修复和改进
12,Jemalloc升级到5.1(前面内存清理使用到)

内存整理和内存报告

  • 应用场景
1、运行期间进行内存碎片清理,释放内存
2、通过内存报告知道整个系统内存使用情况
  • 如何使用
    1、进去redis.conf文件打开activedefrag yes配置
    2、查看:info memory