2024.3.5Redis总结

什么是Redis?

最权威的解释就是看官网:Introduction to Redis | Redis

Redis is an open source (BSD licensed), in-memory data structure store used as a database, cache, message broker, and streaming engine. Redis provides data structures such as stringshasheslistssetssorted sets with range queries, bitmapshyperloglogsgeospatial indexes, and streams. Redis has built-in replicationLua scriptingLRU evictiontransactions, and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.

Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串哈希表列表集合有序集合位图hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区

Redis本质是一个数据库,就像算法的本质是逻辑,数据结构的本质是用来存储数据。Redis基于内存实现,内存是易失性存储器,相比磁盘,容量小,价格高,速度快。我们所熟知的数据库MySQL就是基于磁盘的,做持久化存储,即保证数据安全性,非易失性存储。

基于内存特性的存储

Mysql数据库中的索引就基于内存,数据库中的索引的作用是提高查询效率,防止查询压力过大。所谓的压力是来自大量的查询任务,和大量的数据,CPU性能的有限,基于磁盘的存储除去数据安全性之外,相比内存存储,数度慢,因此效率更低,因此才要更加注重内存的开发,这也决定了Redis 的使用场景,如数据量大时使用redis能提高速度。但索引不同于redis,redis是键值对型存储数据,键只能是字符串,不同于Java中数据结构map,键可以是对象。同一个key只能对应一个value。

使用场景的考虑

思考数据库的本质,算法的本质,数据结构的本质等,从场景上来分析某种技术更能加深对技术原理的理解,有个词叫“技术选型”,技术选型是指在软件开发过程中,从众多可选的技术方案中,选择最适合项目需求、团队技能、时间和预算的技术方案。

思考QQ,视频点赞,为什么要用redis,不用mysql?

首先因为点赞的频率高,第二就是因为读是原子的,写是原子的,读加写就不是原子的。redis自带锁,在高并发的情况下,数据量大,为了减小数据库的压力,用redis更合适些。

除此之外,还有一些非必要持久化存储的数据,如短信验证码等。

业务本身: 数据结构+算法。根据业务来选取适合业务场景的数据结构,来将数据存放到redis,做缓存。

Redis数据结构的使用场景

String

最基本的键值对

1.不需要持久化的数据或者频繁更新的数据,比如验证码,点赞数。

2.对象缓存:可以通过序列化工具类,来缓存java对象,比如将某个对象序列化为json,需要用的时候再取出来,反序列化。常见的使用方式有mybatis二级缓存,接口级别缓存等等。

set name zhencong   --存放字符串键值对
mset name zhencong age 18 --批量存放键值对
SETNX name zhencong  --如果不存在key为name,那么就设置value(分布式锁的原理)
get name   -- 获取key
mget name age  --批量获取key
DEL key -- 删除key
expire key 60 --设置过期时间,单位为秒
INCR key -- 将key中存储的数字加1
DECR key -- 将key中存储的数字减1
INCRBY key 2  --将key中存储的值都加上2
DECRBY key 2 --将key中存储的值都减去2

Hash

是一个key-value的键值对,和java里的hashMap相似,当数据量较小是采用的是ziphash(默认),当数据量较大时采用hashtable。至于什么转换可以在配置文件进行配置。可以用于存储系统中对象的数据。

hset hash name zhencong --设置值,
hget hash name  -- 获取值
hmset hash name zhencong age 18 --批量设置
hmget hash name age --批量获取
hgetall hash 获取key的所有值
hkeys hash 获取hashmap中所有的key
hvals hash 获取hashmap中所有的value

List

redis的list为quickList(快速链表)即多个ziplist(压缩链表)组合起来的。

ziplist是由一系列特殊编码的连续内存块组成的顺序存储结构,类似于数组,ziplist在内存中是连续存储的,但是不同于数组,为了节省内存 ziplist的每个元素所占的内存大小可以不同,每个节点可以用来存储一个整数或者一个字符串。 ziplist类似于双向链表,但是它不存储上一个节点和下一个节点的指针,而是存储上一个节点长度和当前节点长度,通过牺牲部分读写性能,来换取高效的内存空间利用率,节约内存。 zlbytes:记录了压缩列表占用的内存字节数,在对压缩列表进行内存重分配,或者计算zlend的位置时使用。

rpush myList value1 --向 list 的头部(右边)添加元素
rpush myList value2 value3 --向list的头部(最右边)添加多个元素
lpop myList # 将 list的尾部(最左边)元素取出
rpop myList2 value1 --尾插

可以实现结构,即先进后出。先rpush再rpop

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值