百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Redis缓存机制与应用

nanshan 2025-03-01 14:51 14 浏览 0 评论

Redis是目前最为主流的缓存技术之一,Redis基于内存操作从而拥有强大的性能,可以达到每秒10万次的请求,可以说是一款非常强大的缓存技术了。

本文分为三部分:

  • 基础知识介绍
  • 常用技术讲解与缓存机制
  • 使用场景、缓存问题

基础知识介绍

NoSQL概述

什么是NoSQL?

NoSQL = Not Only SQL (不仅仅是SQL)

关系型数据库:表格 ,行 ,列

非关系型数据库:没有固定的查询语言,键值对存储,列存储,文档存储

随着web2.0互联网的诞生!传统的关系型数据库很难对付web2.0时代!尤其是超大规模的高并发的社区。


NoSQL 特点

1、方便扩展

2、大数据量高性能(Redis 一秒写8万次,读取11万)

3、数据类型是多样性的


NoSQL四大分类

KV键值对:如Redis主要是用于内容缓存,主要是为了处理大量数据高访问负载

文档型数据库:如MongoDBMongoDB 是一个基于分布式文件存储的数据库

列存储数据库:如HBase分布式文件系统,以列簇式存储,将同一列数据存储在一起

图关系数据库:如Neo4j他不是存图形,放的是关系,比如:朋友圈社交网络,广告推荐!


Redis简介

Redis 是什么?

Redis(Remote Dictionary Server ),即远程字典服务,它是一个开源的由ANSI C语言编写,性能优秀、支持网络、可持久化的Key-Value内存的NoSQL数据库!


Redis 能干嘛?

1、内存存储、持久化。

2、效率高,可以用于高速缓存

3、发布订阅系统

4、计时器、浏览量! 5、........


Redis好处

主要从“高性能”和“高并发”这两点来介绍。

把数据库数据存入缓存,请求直接从内存中读取不用经过数据库,减轻数据库压力并且提升性能。

常用技术讲解与缓存机制

Redis主要有5种数据类型,包括String,List,Set,Zset,Hash,满足大部分的使用要求

String

  • String:session、对象、小文件(存文件流字节数组,比磁盘IO快)?
  • int:秒杀、限流、计数
  • bitmap:

场景1.setbit和bitcount结合可以统计一年365天哪天有用户操作过,getbit可以获取某一天是否用户操作过

场景2.权限控制,比如每个权限对应一个bit,哪个用户有该权限,该位为1,没权限为0

list

替换java jvm中的集合,可以作为数据共享,java的话多进程间不能共享或不好共享

hash

可以使redis key变少,类似对象。

场景1.商品详情页、商品对应的收藏数、库存啊,放在redis中因为是原子性的,多地方访问都是实时性的

场景2.聚合场景:一个对象在数据库中可能各个属性在不同表,可以聚合到redis同个对象中

set

set性能慢,可以单独redis实例

场景1.SRANDMEMBER或者spop命令可以用来抽奖

场景2.随机事件

场景3.共同好友(交集)

场景4.推荐好友(差集)

sorted_set

有序集合,数量少时底层是zipList压缩表,数据多了变skiplist

场景1.排行榜

场景2.有序事件

场景3.评论分页

Redis 中除开最常用的 5 种数据类型之外,还有 3 种特殊的数据类型

可以通过help命令查询相关类型命令说明,比如:

help @string
help @list

分享一下我记录的几种数据类型的基本命令

String

#设置值
set key value


#获取值
get key


#获取值类型(set的都是String)
type key?


#获取值编码类型(raw/int)
object encoding key


#获取字节长度(注意1字节等于8位bit)
strlen key


#+1计算
#incr key

bitmap(二进制操作)

#设置该值左边第几位为1,bit长度不是8位整数的补成8的整数长度,如 10会补成00000010,? 0100000001?会补成0000000100000001
格式:setbit key offset value
setbit k1 1 1? #01000000? 对应ascii码为‘@’
get k1? #'@'
#将k1值得第7位设置为1
setbit k1 7 1 #01000001?对应ascii码为‘A’
setbit k1 8 1 #0100000110000000??

#获取对应位置bit的值(1或0)
getbit key offset

getbit k1 7? #假如k1值位00000001,第7位返回1
getbit k1 5? #假如k1值位00000001,第5位返回0

#获取对应范围内1的数量(注意范围是字节区间,不是Bit位区间)
bitcount key [start end]
bitcount k1 #获取bit位为1的数量 相当于bitcount k1 0 -1(假如k1值位00001001,返回2,假如k1值位0000000100001001,返回3)
bitcount k1 0 0 #获取第一个字节的8位Bit中有几位为1 (假如k1值位0000000100001001,返回1),注意是从左边开始数每8位为一个字节

#与、或、非、异或操作
bitop opration destkey key [key...]? #opration可选值(and/or/not),destkey为计算完后要保存的新的key
bitop and k3 k1 k2 #与运算,假如k1为01000000,k2为00000001,则结果k3为00000000
bitop or k3 k1 k2 #或运算,假如k1为01000000,k2为00000001,则结果k3为01000001
bitop xor k3 k1 k2 #异或运算,假如k1为01000000,k2为01000001,则结果k3为00000001
bitop not k3 k1? #非运算,假如k1为01000000,则结果k3为10111111


list(链表)

#左边插入
格式:lpush key value [value...]
lpush k1 1 2 3 4 5 6? #k1值为六项:6 5 4 3 2 1

#右边插入
格式:rpush key value [value...]
rpush k1 1 2 3 4 5 6??#k1值为六项:1 2 3 4 5 6

#获取k1范围内的的值
lrange k1 0 -1?

#获取第一个数(最左边的数)并删除该值(像栈操作)
lpop key? #k1值为六项:1 2 3 4 5 6?那么会返回1,k1值变为2 3 4 5 6

#获取指定下标值
lindex key

#删除范围之外的数值
ltrim key start end?
ltrim k1 0 3?#k1值为六项:1 2 3 4 5 6,那么k1只留下1 2 3 4

hash(对象)

#设置对象属性值
hset key field value
hset user1 name huangtl #设置user1的name属性为huangtl
hset user1 age? 18 #设置user1的age属性为18

#单个属性获取
hget user1 age #18

#所有属性获取
hgetall user1 #返回属性、值、属性、值 :name huangtl age 18

#获取对象所有key
hkeys user1 #返回user1的所有属性:name age

#获取对象所有kvalue
hvals user1?#返回user1的所有属性得值:huangtl 18


set(无序、去重集合)

#存入集合数据
sadd key member [member...]
sadd k1 1 2 3 4 5 6 2 #两个2知会存一个2,集合内数值有1 2 3 4 5 6

#获取集合数据
SMEMBERS k1

#随机获取集合几条数据
SRANDMEMBER k1 [count]
SRANDMEMBER k1 #随机获取一条
SRANDMEMBER k1 8 #随机获取8条数据,不会重复的数据,集合不足8条取集合全部数据
SRANDMEMBER k1 -8 #随机取8条,可能会重复的数据,集合不足8条也会取8条数据

#取数值并删除
spop key [count]
spop key? #随机取一条并删除
spop key 5 #随机取5条并删除

#多个集合取并集
SUNION key [key...]
SUNION k1 k2 #假如k1为1 2 3 4 5 6 ,k2为4 5 6 7 8 9,则返回1 2 3 4 5 6 7 8 9

#多个集合取交集
SINTER key [key...]
SINTER k1 k2?#假如k1为1 2 3 4 5 6 ,k2为4 5 6 7 8 9,则返回4 5 6?

#多个集合取差集
sdiff key [key...]
sdiff k1 k2 #按顺序取k1减掉k2中的值后剩下的值 #假如k1为1 2 3 4 5 6 ,k2为4 5 6 7 8 9,则返回1 2 3?
sdiff k2 k1 #按顺序取k2不减掉k1中的值值后剩下的值 #假如k1为1 2 3 4 5 6 ,k2为4 5 6 7 8 9,则返回7 8 9


sorted_set(有序集合)

#新建key并添加元素
zadd key score member [score member...]
zadd set1 1 apple 2 orange 3 banana

#返回范围内集合数据,按score分值正序
zrange set1 0 -1? #默认返回?apple orange banana
zrange set1 -2 -1 #按正序取最后两名,返回 orange banana
ZREVRANGE set1 0 1 #倒序返回前两名,返回 ?banana?orange

#获取元素位置
zrank set1 apple #返回0,代表apple在第一位


事务

Redis 事务本质:一组命令的集合! 一个事务中的所有命令都会被序列化,在事务执行过程的中,会按照顺序执行!

Redis单条命令式保存原子性的,但是事务不保证原子性!

# 开启事务
multi?

#命令入队
set k1 v1?
set k2 v2??
get k2??

# 执行事务
exec? ?


Redis持久化

持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。

redis提供两种持久化机制 RDB(默认) 和 AOF 机制。

1、RDB

RDB是Redis DataBase缩写快照 ,默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb

触发机制

(1)save的规则满足的情况下

(2)执行 flushall 命令

(3)退出redis,也会产生 rdb 文件


2、AOF:

持久化,AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。

AOF的三种策略(1)always (2)everysec(默认值) (3)no always


在应用时,要根据自己的实际需求,选择RDB或者AOF,其实,如果想要数据足够安全,可以两种方式都开启,但两种持久化方式同时进行IO操作,会严重影响服务器性能,因此有时候不得不做出选择。


redis主从复制

概念主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。

优点:(1)读写分离 (2)备份

缺点:主服务器宕机,需要人工启动


哨兵模式

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。


使用场景、缓存问题

1、热点数据的缓存

公司项目用户量达到一定数量的时候,这时合理的利用缓存不仅能够提升项目访问速度,还能大大降低数据库的压力。

2、业务上的统计,排行榜

为了保证数据实时效,比如项目的访问量,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力

3、限时业务的运用

每日签到、限制登录功能等业务场景

4、消息队列

提供基本的发布订阅功能,但不像消息队列那种专业级别


缓存雪崩

原因:大量redis key在同一时间失效,导致大量请求访问数据库,数据库服务器宕机,线上服务大面积报错。

解决办法:

(1)redis高可用

(2)加锁排队,限流降级

(3)缓存失效时间均匀分布


缓存穿透

原因:指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。

解决办法: (1)接口层增加校验 (2)采用布隆过滤器

缓存击穿

原因:指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。比如微博热搜。

解决办法:

(1)设置热点数据缓存没有过期时间

(2)加互斥锁


好了就介绍到这了,可以自己动手尝试吧。

相关推荐

0722-6.2.0-如何在RedHat7.2使用rpm安装CDH(无CM)

文档编写目的在前面的文档中,介绍了在有CM和无CM两种情况下使用rpm方式安装CDH5.10.0,本文档将介绍如何在无CM的情况下使用rpm方式安装CDH6.2.0,与之前安装C5进行对比。环境介绍:...

ARM64 平台基于 openEuler + iSula 环境部署 Kubernetes

为什么要在arm64平台上部署Kubernetes,而且还是鲲鹏920的架构。说来话长。。。此处省略5000字。介绍下系统信息;o架构:鲲鹏920(Kunpeng920)oOS:ope...

生产环境starrocks 3.1存算一体集群部署

集群规划FE:节点主要负责元数据管理、客户端连接管理、查询计划和查询调度。>3节点。BE:节点负责数据存储和SQL执行。>3节点。CN:无存储功能能的BE。环境准备CPU检查JDK...

在CentOS上添加swap虚拟内存并设置优先级

现如今很多云服务器都会自己配置好虚拟内存,当然也有很多没有配置虚拟内存的,虚拟内存可以让我们的低配服务器使用更多的内存,可以减少很多硬件成本,比如我们运行很多服务的时候,内存常常会满,当配置了虚拟内存...

国产深度(deepin)操作系统优化指南

1.升级内核随着deepin版本的更新,会自动升级系统内核,但是我们依旧可以通过命令行手动升级内核,以获取更好的性能和更多的硬件支持。具体操作:-添加PPAs使用以下命令添加PPAs:```...

postgresql-15.4 多节点主从(读写分离)

1、下载软件[root@TX-CN-PostgreSQL01-252software]#wgethttps://ftp.postgresql.org/pub/source/v15.4/postg...

Docker 容器 Java 服务内存与 GC 优化实施方案

一、设置Docker容器内存限制(生产环境建议)1.查看宿主机可用内存bashfree-h#示例输出(假设宿主机剩余16GB可用内存)#Mem:64G...

虚拟内存设置、解决linux内存不够问题

虚拟内存设置(解决linux内存不够情况)背景介绍  Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存...

Elasticsearch性能调优(5):服务器配置选择

在选择elasticsearch服务器时,要尽可能地选择与当前业务量相匹配的服务器。如果服务器配置太低,则意味着需要更多的节点来满足需求,一个集群的节点太多时会增加集群管理的成本。如果服务器配置太高,...

Es如何落地

一、配置准备节点类型CPU内存硬盘网络机器数操作系统data节点16C64G2000G本地SSD所有es同一可用区3(ecs)Centos7master节点2C8G200G云SSD所有es同一可用区...

针对Linux内存管理知识学习总结

现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。对于内存部分需要知道:地址映射内存管理的方式缺页异常先来看一些基本的知识,在进程看来,内存分为内...

MySQL进阶之性能优化

概述MySQL的性能优化,包括了服务器硬件优化、操作系统的优化、MySQL数据库配置优化、数据库表设计的优化、SQL语句优化等5个方面的优化。在进行优化之前,需要先掌握性能分析的思路和方法,找出问题,...

Linux Cgroups(Control Groups)原理

LinuxCgroups(ControlGroups)是内核提供的资源分配、限制和监控机制,通过层级化进程分组实现资源的精细化控制。以下从核心原理、操作示例和版本演进三方面详细分析:一、核心原理与...

linux 常用性能优化参数及理解

1.优化内核相关参数配置文件/etc/sysctl.conf配置方法直接将参数添加进文件每条一行.sysctl-a可以查看默认配置sysctl-p执行并检测是否有错误例如设置错了参数:[roo...

如何在 Linux 中使用 Sysctl 命令?

sysctl是一个用于配置和查询Linux内核参数的命令行工具。它通过与/proc/sys虚拟文件系统交互,允许用户在运行时动态修改内核参数。这些参数控制着系统的各种行为,包括网络设置、文件...

取消回复欢迎 发表评论: