Redis概述

 Redis是一个开源的、基于内存的数据结构存储器,可以用作数据库、缓存和消息中间件

Redis最常用的功能

  • 缓存
  • 分布式锁
 本文介绍使用环境
  • Windows 10

  • Redis 3.0.504

如何安装Redis就不做介绍,若不想安装Redis环境,可以使用try redis尝试Redis功能
CMD 启动 Redis,打开Reids目录,执行下面命令,出现下面图片代表启动成功
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】入门的更多相关文章

  1. 安装redis入门

    redis官网:redis.io redis版本用的是redis-3.2.2 $ wget http://download.redis.io/releases/redis-3.2.2.tar.gz $ ...

  2. redis入门笔记(2)

    redis入门笔记(2) 上篇文章介绍了redis的基本情况和支持的数据类型,本篇文章将介绍redis持久化.主从复制.简单的事务支持及发布订阅功能. 持久化 •redis是一个支持持久化的内存数据库 ...

  3. redis入门笔记(1)

    redis入门笔记(1) 1. Redis 简介 •Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure serv ...

  4. Redis入门指南

    随着互联网业务对性能需求日益强烈,作为Key/Value存储的Redis具有数据类型丰富和性能表现优异的特点.如果能够熟练地驾驭它,不管是把它用做缓存还是存储,对很多大型应用都很多帮助.新浪作为世界上 ...

  5. Redis入门教程:特性及数据类型的操作

    虽然Redis已经很火了,相信还是有很多同学对Redis只是有所听闻或者了解并不全面,下面是一个比较系统的Redis介绍,对Redis的特性及各种数据类型及操作进行了介绍.是一个很不错的Redis入门 ...

  6. 【原】Redis入门教程

    最近在学习Redis,写几篇文章记录一下学习过程:Redis入门教程. 1.Redis基本概念 Redis Redis Keys Redis 基本数据类型 Redis基本操作 遍历操作 Pub-Sub ...

  7. windows下使用redis,Redis入门使用,Redis基础命令

    windows下使用redis,Redis入门使用,Redis基础命令 >>>>>>>>>>>>>>>> ...

  8. Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式)

    Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式) 原文地址:http://alanland.iteye.com/admin/blogs/1600685(欢迎转载 ...

  9. redis入门(15)redis的数据备份和恢复

    redis入门(15)redis的数据备份和恢复

  10. redis入门(14)redis集群下的数据分区存储

    redis入门(10)redis集群下的数据分区存储

随机推荐

  1. 压力测试(三)-自定义变量和CSV可变参数实操

    1.Jmeter用户自定义变量实战 简介:什么是用户自定义变量,怎样使用 为什么使用:很多变量在全局中都有使用,或者测试数据更改,可以在一处定义,四处使用 比如服务器地址 1.线程组->add ...

  2. BeetleX之XRPC远程委托调用

    BeetleX.XRPC是基于接口的远程通讯组件,它不紧可以把接口提供客户端调用,同样也支持服务端创建客户端的接口实例并主动调用客户端的方法.接口有着非常的规范性和约束性,但前提你是必须制定相应的接口 ...

  3. php表单提交后再后退 内容则默认清空的解决方法

    转载原文地址: http://www.jquerycn.cn/a_14422 在session_start()之后,字符输出之前加上header("Cache-control: privat ...

  4. 学h5前端开发前必知的三大流行趋势

    学h5前端开发前必知的三大流行趋势 随着互联网时代的飞速发展,各种互联网的Web应用程序层出不穷,很多人对于HTML5前端开发的过程充满了好奇,但是却没有了解到前端开发的未来发展趋势.下面,云慧学院专 ...

  5. mac 工具推荐

    传送门: https://github.com/jaywcjlove/awesome-mac/blob/master/README-zh.md

  6. Vue父子组件通讯

    我们知道,父组件不能修改子组件的数据[这种说法是不严谨的],严谨的说法是:子组件内部不能修改从父组件传递过来的值.原因是vue遵循的是数据单向流原则,父组件传递数据给子组件只能单向绑定,通过Props ...

  7. 网络编程---socket模块

    内容中代码都是先写  server端, 再写 client端 1 TCP和UDP对比 TCP(Transmission Control Protocol)可靠的.面向连接的协议(eg:打电话).传输效 ...

  8. Python模块一

    logging模块 我们来说一下这个logging模块,这个模块的功能是记录我们软件的各种状态,你们现在和我一起找到红蜘蛛的那个图标,然后右键找一找是不是有个错误日志.其实每个软件都是有错误日志的,开 ...

  9. (转)C++中的new

    转载自:http://blog.csdn.net/sparkliang/article/details/3650324 C++中的new其实是一个很糊弄人的术语,它有两种不同的含义,new运算符(ne ...

  10. typescript package.json vscode 终端 运行任务 Ctrl shift B

    { "dependencies": { "typescript": "^3.6.4" } }