【Redis】入门
Redis概述
Redis最常用的功能
- 缓存
- 分布式锁
Windows 10
Redis 3.0.504
redis-server redis.windows.conf

Redis常用数据结构
字符串(String)
用途
- 存放字符串/数字
- 常规key-value缓存应用
- 常规计数:订单数,商品数
| 常用命令 | 用途 |
|---|---|
| set key value | 设置指定 key 的值 |
| get key | 获取指定key的值 |
| decr key | 将指定的key的值递减1,若设置的值不是数字,报错 |
| incr key | 将指定的key的值递增1,若设置的值不是数字,报错 |
| mget key1 [key2] | 获取指定的key,返回多个值 |

哈希(Hash)
用途
- hash 特别适合用于存储对象(用户信息,商品信息)
- 可以修改/读取对象某个值
| 常用命令 | 用途 |
|---|---|
| hset key field value | 设置单个对象值 |
| hget key field value | 获取的那个对象值 |
| hmset key field1 value [field2 value2] | 设置对象多个字段值 |
| hmget | 获取对象多个值 , 返回列表 |
| hgetall | 获取指定key对象字段和值 |

列表(List)
用途
- 双向链表 ,支持反向查找和遍历
- 可以添加重复数据
- 适合存放消息列表,产品列表,订单列表等
| 常用命令 | 用途 |
|---|---|
| lpush key value | 向链表左边推送值 |
| rpush key value | 向链表右边推送值 |
| lpop key | 链表的左边弹出值 |
| rpop key | 链表的右边弹出值 |
| lrange key start end | 链表左边指定范围内的元素 , 多用于分页 |
| llen key | 获取链表长度 |

集合(Set)
用途
- 跟列表类似,集合会去重复
| 常用命令 | 用途 |
|---|---|
| sadd key value | 添加一个元素 |
| spop key value | 随机返回一个元素 |
| smembers key | 返回集合所有成员 |
| sunion key1 key2 | 返回所有给定集合的并集 |

有序集合(Sorted Set)
用途
- 集合中的元素能够按score进行有序排列
- 多用于排名数据
- score 相同情况下,按字典键值排序
| 常用命令 | 用途 |
|---|---|
| zadd key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
| zrange key start end | 返回有序集合指定范围数据 |
| zrem key member | 移除指定成员 |
| zcard key | 获取集合成员数 |

Redis删除过期数据策略
Redis删除过期数据有两种机制
1. 定期删除 :redis默认是每隔 100ms 就随机抽取过期的数据删除
2. 惰性删除 : 访问数据的时候检查数据是否过期
Redis内存淘汰机制
当遇到写入数据的时候内存不够,Redis有下面几种机制来决定如何操作
| 方式 | 说明 |
|---|---|
| volatile-lru | 从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 |
| volatile-ttl | 从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰 |
| volatile-random | 从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰 |
| allkeys-lru | 当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key |
| allkeys-random | 从数据集(server.db[i].dict)中任意选择数据淘汰 |
| noeviction | 禁止删除,若超出内存报错 |
| volatile-lfu | 从已设置过期时间的数据集挑选使用频率最低的数据淘汰(Redis5.0 以后才有) |
| allkeys-lfu | 从数据集中挑选使用频率最低的数据淘汰(Redis5.0 以后才有) |
在配置文件里面打开maxmemory-policy配置项,默认是:noeviction
通常情况配合maxmemory配置设置最大内存使用

Redis持久化机制
Redis支持两种持久化方式
快照(snapshotting)持久化(RDB)
- Redis可以通过创建快照来获得存储在内存里面的数据在某个时间点上的副本
- Redis默认采用的持久化方式
- 配置多个save配置项指定触发创建副本条件,例:save 900 1 , 900秒内至少一个Key发生变化触发创建快照
- 缺点:若没达到触发条件,数据容易丢失
AOF(append-only file)持久化
- 开启AOF持久化后,根据选择的方式写入AOF文件中
- 配置appendfsync 配置项,配置同步频率
- 缺点:可能经常发生同步,影响Redis的速度
AOF有3种方式
| 方式 | 说明 |
|---|---|
| appendfsync always | 每次有数据修改发生时都会写入AOF文件 ,严重降低Redis的速度 |
| appendfsync everysec | 每秒钟同步一次,显示地将多个写命令同步到硬盘 |
| appendfsync no | 让操作系统决定何时进行同步 |
为了兼顾数据和写入性能,用户可以考虑 appendfsync everysec 选项 ,让 Redis 每秒同步一次 AOF 文件,Redis 性能几乎没受到任何影响。
Redies默认AOF是关闭的,通过修改配置打开

Redis 4.0 对于持久化机制的优化
Redis 4.0 开始支持 RDB 和 AOF 的混合持久化(默认关闭,可以通过配置项 aof-use-rdb-preamble 开启)。
如果把混合持久化打开,AOF 重写的时候就直接把 RDB 的内容写到 AOF 文件开头。
这样做的好处是可以结合 RDB 和 AOF 的优点, 快速加载同时避免丢失过多的数据。
当然缺点也是有的,AOF 里面的 RDB 部分是压缩格式不再是 AOF 格式,可读性较差。
由于Windows的版本最新只有3.0,这个就没法验证
缓存问题及解决方案
缓存雪崩
同一时间大面积缓存失效,大量请求落到数据库上
解决
- 缓存设置过期时间时加上一个随机值时间,使得每个key的过期时间分布开来,不会集中在同一时刻失效
缓存穿透
请求缓存不存在的数据,然请求穿透缓存到数据库,通常是黑客攻击
解决
- 采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤
- 访问key未在DB查询到值,也将空值写进缓存,但可以设置较短过期时间
- 采用签名验证提交数据
缓存击穿
缓存过期的一刻,同时有大量的请求,由于缓存失效,导致请求都落到DB
解决
- 单体使用互斥锁(mutex key)
- 分布式使用setnx
- 双重校验访问缓存数据(Double Check),就是线程安全的单例模式
转发请标明出处:https://www.cnblogs.com/WilsonPan/p/12635605.html
【Redis】入门的更多相关文章
- 安装redis入门
redis官网:redis.io redis版本用的是redis-3.2.2 $ wget http://download.redis.io/releases/redis-3.2.2.tar.gz $ ...
- redis入门笔记(2)
redis入门笔记(2) 上篇文章介绍了redis的基本情况和支持的数据类型,本篇文章将介绍redis持久化.主从复制.简单的事务支持及发布订阅功能. 持久化 •redis是一个支持持久化的内存数据库 ...
- redis入门笔记(1)
redis入门笔记(1) 1. Redis 简介 •Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure serv ...
- Redis入门指南
随着互联网业务对性能需求日益强烈,作为Key/Value存储的Redis具有数据类型丰富和性能表现优异的特点.如果能够熟练地驾驭它,不管是把它用做缓存还是存储,对很多大型应用都很多帮助.新浪作为世界上 ...
- Redis入门教程:特性及数据类型的操作
虽然Redis已经很火了,相信还是有很多同学对Redis只是有所听闻或者了解并不全面,下面是一个比较系统的Redis介绍,对Redis的特性及各种数据类型及操作进行了介绍.是一个很不错的Redis入门 ...
- 【原】Redis入门教程
最近在学习Redis,写几篇文章记录一下学习过程:Redis入门教程. 1.Redis基本概念 Redis Redis Keys Redis 基本数据类型 Redis基本操作 遍历操作 Pub-Sub ...
- windows下使用redis,Redis入门使用,Redis基础命令
windows下使用redis,Redis入门使用,Redis基础命令 >>>>>>>>>>>>>>>> ...
- Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式)
Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式) 原文地址:http://alanland.iteye.com/admin/blogs/1600685(欢迎转载 ...
- redis入门(15)redis的数据备份和恢复
redis入门(15)redis的数据备份和恢复
- redis入门(14)redis集群下的数据分区存储
redis入门(10)redis集群下的数据分区存储
随机推荐
- 前端每日实战:34# 视频演示如何用纯 CSS 创作在文本前后穿梭的边框
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/qYepNv 可交互视频教程 此视频 ...
- win10执行Tensorflow,总是会报错“DLL load failed: 找不到指定的模块”的解决方式----终极版方式
win10上运行tensorflow时报错,“DLL load failed: 找不到指定的模块”的解决方式 我只想说,当你们遇到这个问题的时候,以下终极版的方式出来了,非常感谢知乎 leo lv ! ...
- python框架Django实战商城项目之工程搭建
项目说明 该电商项目类似于京东商城,主要模块有验证.用户.第三方登录.首页广告.商品.购物车.订单.支付以及后台管理系统. 项目开发模式采用前后端不分离的模式,为了提高搜索引擎排名,页面整体刷新采用j ...
- AOP和spring AOP学习记录
AOP基本概念的理解 面向切面AOP主要是在编译期或运行时,对程序进行织入,实现代理, 对原代码毫无侵入性,不破坏主要业务逻辑,减少程序的耦合度. 主要应用范围: 日志记录,性能统计,安全控制,事务处 ...
- 关于使用fastjson出现的问题:com.alibaba.fastjson.JSONException: syntax error, expect {, actual string, pos 1, fastjson-version 1.2.44
先说下需求:是从redis中根据keys批量获取数据集合,再通过fastjson转为对象集合 代码如下: 在postman测试后,出现错误如下: 刚开始以为是使用fstjson方法不对,后面先通过打断 ...
- 移动webApp必备技能一、WebApp 里Meta标签大全,webappmeta标签大全
1.先说说mate标签里的viewport: viewport即可视区域,对于桌面浏览器而言,viewport指的就是除去所有工具栏.状态栏.滚动条等等之后用于看网页的区域.对于传统WEB页面来说,9 ...
- 面试被问分布式事务(2PC、3PC、TCC),这样解释没毛病!
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 一口气说出 9种 分布式ID生成方式,面试官有点懵了 ...
- vue的watch
watch它可以用来监测Vue实例上的数据变动 尽量一张图解释清楚(尝试用圈圈区分关系): 写的很简单,watch本来就没啥东西我理解为响应式侦听全局变量 watch里绑定全局变量,被绑定全局变量发 ...
- 仿IntelliJ Darcula的Swing主题FlatLaf使用方法
最近Sandeepin想写个基于Java Swing的RSS阅读器练练手,不过Swing默认主题太丑了,切成系统原生的主题也不是非常好看,正好感觉开发时用的IDEA主题很不错,不管是Light还是Da ...
- 我的学习笔记之node----node.js+socket.io实时聊天(1)
本想着从hello word开篇,也确实写了相关学习笔记.各种原因吧,现在又着急写出作品,便作罢. 这里将记录一个node.js+socket.io的实时聊天程序.(当然我也是跟着网上各种教程资料学习 ...