Redis基本概念知识

Redis是一个高性能的内存键值数据库,支持五种数据类型:STRING、LIST、SET、HASH、ZSET。文章详细介绍了Redis的数据类型及其应用场景,如STRING用于热点数据存储,LIST常用于消息队列,SET和ZSET(有序集合)适用于数据去重和排名。重点讲解了Redis的底层数据结构,包括String的sds、列表的ziplist和quicklist、字典和跳跃表(ziplist)。此外,文章还涵盖了Redis的持久化策略,如RDB快照和AOF日志,以及混合持久化。主从复制、哨兵和集群实现高可用性。最后,探讨了缓存更新机制和应对缓存雪崩、击穿、穿透的策略,以及使用布隆过滤器防止缓存穿透。
摘要由CSDN通过智能技术生成

一、概述

参考作者( 架构师余胜军 ,程序员历小冰)
redis字典结构参考博客
RDB参考图片

Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。

键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。

Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能,使用分片来扩展写性能。

二、数据类型

数据类型 可以存储的值
STRING 字符串、整数或者浮点数
LIST 列表
SET 无序集合
HASH 包含键值对的无序散列表
ZSET 有序集合

STRING

set key value	将字符串值 value 关联到 key ,如果 key 已经持有其他值, SET 就覆写旧值,无视类型。
get key			取key的值value
del key			删除key:删除操作成功 返回(integer)1;删除操作失败 返回(integer)0

高级命令:
mset k1 v1 k2 v2 k3 v3 ...      一次性添加或修改多个键值对
mget k1 k2 k3...          		一次性获取k1 k2 k3...的value
strlen k                		获取k对应的v的字符串长度
append k v 						往k对应的v尾部追加数据,如果不存在就新建,这时候相当于set k v

自增自减操作控制数据库主键:
incr key                   对应的value加1
decr key                   对应的value减1
incrby key increment       对应的value+increment
decrby key increment       对应的value-increment
incrbyfloat key increment  对应的value+一个浮点数

数据库的热点数据key命名规范:

表名:主键名:主键值:字段名

LIST

内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的

lpush key value1 value2 ...         	左侧插入
rpush key value1 value2 ... 			右侧插入
lrange key start stop       			从start开始到stop结束的下标的数据,索引从0开始,如果是负数结束,比如stop=-1,那就是截止到倒数第一个
lindex key index            			找到index位置的数据
lpop key 								移除并返回第一个元素
rpop key 								移除并返回最后一个元素
llen									获取列表中元素个数
lrem key count value					删除list列表中number个value(因为list元素可以重复,所以要指定count)									  1)当count>0时, lrem会从列表左边开始删除
                             				 2)当count<0时, lrem会从列表后边开始删除
                             				 3)当count=0时, lrem删除所有值为value的元素                           
ltrim key start stop					只保留列表中start开始到stop结束之间指定片段的数据
linsert key before|after pivot value	该命令首先会在列表中从左到右查找值为pivot的元素,然后根据											第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面
			
> rpush list-key item
(integer) 1
> rpush list-key item2
(integer) 2
> rpush list-key item
(integer) 3

> lrange list-key 0 -1
1) "item"
2) "item2"
3) "item"

> lindex list-key 1
"item2"

> lpop list-key
"item"

> lrange list-key 0 -1
1) "item2"
2) "item"

应用场景: 朋友圈评论,按顺序显示评论的朋友

SET

(1) 存储大量数据、查询速度快
(2) 集合中的数据是不重复且没有顺序
(3) 集合类型的Redis内部是使用值为空的散列表实现,所有这些操作的时间复杂度都为0(1)
(4) 集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,除此之外Redis还提供了多个集合之间的交集、并集、差集的运算。

hash和set的结构:
① hash: key-{field:value}
② set: key-{value:null}

sadd key value1 value2 ... 		添加数据,如果重复添加,会添加失败
smembers key 					获取全部数据
scard key 						获取数据总量
srem key value					删除数据	
sismember key value 			判断value是否是key集合内的数据		


> sadd set-key item
(integer) 1
> sadd set-key item2
(integer) 1
> sadd set-key item3
(integer) 1
> sadd set-key item 
(integer) 0

> smembers set-key
1) "item"
2) "item2"
3) "item3"

> sismember set-key item4
(integer) 0
> sismember set-key item
(integer) 1


HASH

hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持其它类型。
在这里插入图片描述

格式:一个存储空间(key)存储多个键值对,底层通过哈希表进行存储。

​ key {filed1 - v1, filed2 - v2,…}

注意:如果filed数量较少时,会被优化为类数组的结构,如果filed数量多,就是HashMap。

hset key field value    新增/修改某个field的v,新增时返回1,修改时返回0
hsetnx key field value	如果key中没有field字段则设置field值为value,否则不做任何操作
hget key field			获取某个field的v
hgetall key 			获取这个key的所有f-v
hdel key field			删除某个field,可以删除一个或多个,返回值是被删除的字段个数 
del key 				删除整个key
hmset key f1 v1 f2 v2 f3 v3 ...     新增/修改某个field的f1、f2、f3,值分别为v1、v2、v3
hmget key f1 f2 f3...				获取某个field的f1、f2、f3 的值
hlen key             				获取key的字段数量,就是field的数量
hexists key field 					判断key中是否存在field这个字段


> hset hash-key sub-key1 value1
(integer) 1
> hset hash-key sub-key2 value2
(integer) 1
> hset hash-key sub-key1 value1
(integer) 0


> hdel hash-key sub-key2
(integer) 1
> hdel hash-key sub-key2
(integer) 0

> hget hash-key sub-key1
"value1"

注意事项

(1) hash类型的value只能存储string,不允许嵌套存储。如果获取不到对应的数据,返回的是(nil)。

(2) 每个hash最多存储2^32 -1 个键值对。

(3) hash最初设计不是为了存对象,不要把hash当成对象列表使用。

(4) hgetall 可以获取全部属性,如果field过多,遍历一次会很慢,影响程序效率。

应用场景

(1) 电商购物车:添加购物车、浏览购物车商品、更改购物车商品数量、删除商品、清空商品均可实现。
    key : userID
    field : 商品ID
    value : 商品购买数量
演示案例

127.0.0.1:6379> hmset userid:1001 id 10011 name phone number 10
OK
127.0.0.1:6379> hmset userid:1002 id 10012 name xiaomi number 15
OK
127.0.0.1:6379> hgetall userid:1001
1) "id"
2) "10011"
3) "name"
4) "phone"
5) "number"
6) "10"

ZSET(有序集合)

zset使用散列表实现

如果添加重复的数据,score会被最后一次的覆盖

zadd key score1 value1 score2 value2..  --添加数据,向有序集合中加入一个元素和该元素的分数,如果该										  元素已经存在则会用新的分数替换原有的分数
										返回值是新加入到集合中的元素个数,不包含之前已经存在的元素

zrange key start stop [WITHSCORES]      获取数据按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素),
										如果WITHSCORES在末尾,则会把score也输出出来
zrevrange key srart stop [WITHSCORES]	按照元素分数从大到小的顺序返回索引从start到stop之间的所有										 元素,如果WITHSCORES在末尾,则会把score也输出出来。
zcard key 					 			获取数据总量
zcount key min max 						获取[min, max]范围内的数据数量
zrem key value 							删除数据


> zadd zset-key 728 member1
(integer) 1
> zadd zset-key 982 member0
(integer) 1
> zadd zset-key 982 member0
(integer) 0

> zrange zset-key 0 -1 withscores
1) "member1"
2) "728"
3) "member0"
4) "982"

> zrangebyscore zset-key 0 800 withscores
1) "member1"
2) "728"

> zrem zset-key member1
(integer) 1
> zrem zset-key member1
(integer) 0

> zrange zset-key 0 -1 withscores
1) "member0"
2) "982"

获取排名(索引)

zrank key value 				获取value在key中的升序排名,score小的排在前面
zrevrank key value 				降序排名
zscore key value 				拿到value的score
zincrby key increment value 	给value加上对应的increment

127.0.0.1:6379> zadd scores 30 a 50 b 10 c 35 d
(integer) 4
127.0.0.1:6379> zrank scores c				<!--获取c 在key中的升序排名,score小的排在前面-->
(integer) 0
127.0.0.1:6379> zrevrank scores c			<!--获取c 在key中的降序排名,score大的排在前面-->
(integer) 3
127.0.0.1:6379> zscore scores b				<!--获取b 在key中的值 50-->
"50"
127.0.0.1:6379> zincrby scores 5 c			
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值