Redis
一.对比Mysql数据库与Redis数据库的区别

在实际业务(如电商、社交、游戏)中,如果几万人同时刷新商品价格,每次都去查询 MySQL 的硬盘数据,数据库会瞬间过载崩溃。因此,通常采用 MySQL 作为主数据库 + Redis 作为缓存数据库 的架构:
Redis 负责“挡枪”(抗流量):将高频访问、不常变动的热点数据(如商品详情、用户信息、排行榜)缓存到 Redis 中。用户查询时,直接从内存中读取,极大地降低了响应时间(例如从 200ms 降至 20ms)。
MySQL 负责“兜底”(存家底):当用户下单付款、修改密码等涉及核心数据变更时,才去操作 MySQL,确保数据的绝对安全和强一致性。
缓存查询结果(旁路缓存):
当应用需要查询数据时,先查 Redis。如果命中则直接返回;如果未命中,再去查 MySQL,并将结果写入 Redis(设置过期时间)后返回。当应用需要查询数据时,先查 Redis。如果命中则直接返回;如果未命中,再去查 MySQL,并将结果写入 Redis(设置过期时间)后返回。
异步写入(削峰填谷):
对于高并发下的写操作(如秒杀扣减库存),可以先将写操作写入 Redis 快速响应客户端,然后再通过消息队列等方式异步将数据持久化到 MySQL,从而降低数据库的瞬时写入压力。
分布式锁:
在分布式系统中,利用 Redis 的 SETNX 等原子操作实现分布式锁,保证同一时间只有一个线程能够修改 MySQL 中的特定数据,防止并发冲突。
消息队列与数据同步:
利用 Redis 的发布/订阅功能或 Stream 数据结构,将 MySQL 中的数据变更消息推送到队列中,供其他微服务订阅并更新各自的本地缓存或数据库。
总结来说,MySQL 擅长处理复杂的关联查询和保证数据的绝对安全,而 Redis 擅长处理高并发下的极速读写。
二.数据库类型
1.分类:
关系型数据库:Oracle,MySQL,SqlServer,DB2
非关系型数据库:NoSQL仅仅是一个概念,泛指非关系型的数据库,区别于关系数据库,它们不保证关系数据的ACID特性
非关系型数据库的特点非关系型数据库的特点:
1.数据模型比较简单.(主要)
2.需要灵活性更强的应用系统
3.对数据库性能要求较高(主要)
4.不需要高度的数据一致性(主要)
5.对于给定key,比较容易映射复杂值的环境.
2.区别:
关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织
优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。
优点:
1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
3、高扩展性;
4、成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理;
3、数据结构相对复杂,复杂查询方面稍欠。
其中redis属于非关系型数据库,这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署
三.Redis
1.什么是Redis
是以key-value形式存储,和传统的关系型数据库不一样.不一定遵循传统数据库的一些基本要求.(非关系型的,分布式的,开源的,水平可拓展的)
优点:
对数据高并发读写(直接是内存中进行读写的)
对海量数据的高效率存储和访问
对数据的可拓展性和高可用性.
单线程操作,每个操作都是原子操作,没有并发相关问题(redis 6)
缺点:
redis(ACID处理非常简单)
无法做太复杂的关系数据库模型
Redis是以key-value store存储.
键可以包含:(string)字符串,哈希,(list)链表,(set)集合,(zset)有序集合.这些数据集合都指出push/pop,add/remove及取交集和并集以及更丰富的操作.redis支持各种不同方式排序,为了保证效率,数据都是缓存在内存中.它可以从周期性的把更新的数据写入到磁盘或者把修改操作写入追加的文件中.
redis定位是缓存, 提高数据读写速度, 减轻对数据库存储与访问压力
2.Redis的优势
Redis是单线程,现已达到读15w次每秒,写10w次每秒
三.Redis的数据类型
1.String类型的API:
String类型包含多种类型的特殊类型,并且是二进制安全的.比如序列化的对象进行存储,比如一张图片进行二进制存储.,比如一个简单的
Map<String, String> map
map.put("name", Json.toJsonString(user));
类型命令 key 参数数据
set key value -> 存入键值对
gey key -> 根据键取出值
incr key -> 把值递增1
decr key -> 把值递减1
del key -> 根据键删除键值对
setex key timeout value -> 存入键值对,timeout表示失效时间,单位s
ttl key->可以查询出当前的key还剩余多长时间过期
setnx key value -> 如果key已经存在,不做操作, 如果key不存在,直接添加
ttl -> -1:说明永久有效
ttl -> -2:说明已经失效
incrby key num -> 偏移值
mset k1 v1 k2 v2 ... -> 批量存入键值对
mget k1 k2 ... -> 批量取出键值
append key 'value' -> 原值后拼接新内容
setrange key index value -> 修改键对应的值,index表示开始的索引位置
应用场景

计数器:许多运用都会使用redis作为计数的基础工具,他可以实现快速计数、查询缓存的功能,
同时数据可以异步落地到其他的数据源。
如:视频播放数系统就是使用redis作为视频播放数计数的基础组件。
incr viewnum 1
共享session:出于负载均衡的考虑,分布式服务会将用户信息的访问均衡到不同服务器上,
用户刷新一次访问可能会需要重新登录,为避免这个问题可以用redis将用户session集中管理,
在这种模式下只要保证redis的高可用和扩展性的,每次获取用户更新或查询登录信息
都直接从redis中集中获取。
2.Hash类型的API


Hash类型是String类型的field和value的映射表.或者说是一个String集合.它特别适合存储对象,相比较而言,讲一个对象存储在Hash类型里要比存储在String类型里占用更少的内存空间,并方便存储整个对象
Map<string, Map<string, ?>> map
hset key hashkey hashvalue -> 存入一个hash对象
hget key hashkey -> 根据hash对象键取去值
hexists key hashkey -> 判断hash对象是含有某个键
hdel key hashkey -> 根据hashkey删除hash对象键值对
hincrby key hashkey 递增值 -> 递增hashkey对应的值
hlen key -> 获取hash对象键的数量
hkeys key -> 获取hash对象的所有键
hvals key -> 获取hash对象的所有值
hgetall key -> 获取hash对象的所有数据
同样有hsetnx,其作用跟用法和setnx一样
3.Hash与String的区别

如果你只需要存取一个整体的值,或者需要用到原子计数器、分布式锁,选择 String;如果你需要存储一个包含多个属性的对象,且经常需要单独读取或修改其中的某个属性,选择 Hash 会更加高效和灵活。
Redis 的数据存储存在层级嵌套关系:
Key(全局键):是 Redis 中数据对象的全局唯一标识符,用于定位整个 Hash 数据结构。
Field(字段):是 Hash 内部的“局部键”(小型键),用于区分哈希中的不同属性。
Value(值):是 Field 对应的具体数据。
在 Redis 中,Hash 是一个 string 类型的 field 和 value 的映射表。Field 和 Value 共同组成了哈希内部的键值对(field-value),这与 Redis 整体的键值对(key-value)是不同层级的概念。
4.list类型API
Redis中的List类似Java中的queue,也可以当做List来用.
List类型是一个链表结构的集合,其主要功能有push,pop,获取元素等.更详细的说,List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,list的设计非常简单精巧,即可以作为栈,又可以作为队列.满足绝大多数需求.
Map<String, List>
rpush key value -> 往列表右边添加数据
lrang key start end -> 范围显示列表数据,全显示则设置0 -1
lpush key value -> 往列表左边添加数据
lpop key -> 弹出列表最左边的数据(弹出后就少了一个元素)
rpop key -> 弹出列表最右边的数据(弹出后就少了一个元素)
llen key -> 获取列表长度
linsert key before/after refVal newVal -> 参考值之前/后插入数据
lset key index value -> 根据索引修改数据
lrem key count value -> 在列表中按照个数删除数据
ltrim key start end -> 范围截取列表
lindex key index -> 根据索引取列表中数据
5.set类型API
Set集合是string类型的无序集合,set是通过hashtable实现的,对集合我们可以取交集,并集,差集
sadd key value -> 往set集合中添加元素
smembers key -> 列出set集合中的元素
srem key value -> 删除set集合中的元素
spop key count -> 随机弹出集合中的元素
sdiff key1 key2 -> 返回key1中特有元素(差集)
sdiffstore var key1 key2 -> 返回key1中特有元素存入另一个set集合
sinter key1 key2 -> 返回两个set集合的交集
sinterstore var key1 key2 -> 返回两个set集合的交集存入另一个set集合
sunion key1 key2 -> 返回两个set集合的并集
sunionstore var key1 key2 -> 返回两个set集合的并集存入另一个set集合
smove key1 key2 value -> 把key1中的某元素移入key2中
scard key -> 返回set集合中元素个数
sismember key value -> 判断集合是否包含某个值
srandmember key count -> 随机获取set集合中元素
应用场景
1,去重;
2,抽奖;
1,准备一个抽奖池:sadd luckydraw 1 2 3 4 5 6 7 8 9 10 11 12 13
2,抽3个三等奖:spop luckydraw 3
3,抽2个二等奖:spop luckydraw 2
4,抽1个二等奖:spop luckydraw 1
6.zset类型API
zadd key score column -> 存入分数和名称
zincrby key score column -> 偏移名称对应的分数
zrange key start end -> 按照分数升序输出名称
zrevrange key start end -> 按照分数降序输出名称
zrank key name -> 升序返回排名
zrevrank key name -> 降序返回排名
zcard key -> 返回元素个数
zrangebyscore key min max [withscores] -> 按照分数范围升序输出名称
zrevrangebyscore key max min [withscores] -> 按照分数范围降序输出名称
zrem key name -> 删除名称和分数
zremrangebyscore key min max [withscores] -> 根据分数范围删除元素
zremrangebyrank key start end -> 根据排名删除元素
zcount key min max -> 按照分数范围统计个数
应用场景
排行榜:有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:
按照时间、按照播放量、按照获得的赞数等。

浙公网安备 33010602011771号