你真的学会Redis了吗?(一)

一、Redis的应用场景

Redis作为一个用C开发、基于内存结构进行 键值对 数据存储的、高性能的、非关系型(NoSQL)数据库。Redis是基于内存存储的,所以对数据的读写效率很高,被广泛应用在缓存方向。Redis也支持对数据的持久化,保证了数据的安全,而且Redis的操作是原子性的。那么Redis一般回应用在哪些方面呢?

  • 缓存热点数据:缓解数据库的访问夜里,并且提高数据的访问速度
  • 点赞、排行榜、观看数、计数器等功能:这一类的数据对读写要求比较高,但是对数据库的一致性要求并不高
  • 消息中间件:可以使用redis实现应用之间的通信
  • 简单的消息队列:可以使用Redis自身的发布/订阅模式或者List实现简单的消息对象,实现异步操作
  • 分布式锁:基于redis的操作特性可以实现分布式锁功能

二、Redis的优点与缺点

2.1 优点

  • Redis 是基于内存操作的,内存读写性能速度快,性能极高。读可以达到 11W次/秒,写 8.1W次/秒。
  • redis 基于键值对存储,但是支持多种数据类型。如String、Hash、List、Set、ZSet等。
  • Redis 支持RDB和AOF俩种持久化机制,持久化功能可以保证数据的安全,避免数据丢失的问题。
  • Redis 的所有操作都是原子性的。同时还支持将几个操作合并后的原子性操作。
  • Redis 支持主从复制,可以进行读写分离。
  • Redis 是单线程的,有效的避免了线程切换及多线程竞争带来的问题。

2.2 缺点

  • Redis 对结构化查询的支持比较差
  • Reids 使用缓存会存在缓存穿透、缓存击穿及缓存雪崩等问题。
  • Redis 数据库容量受到物理内存的限制,不适合海量数据的高性能读写。

三、Redis的数据类型

Redis是以键值对形式进行数据存储的,但是value支持多种数据类型

3.1 String

最常用的一种数据类型,String 类型的值可以是字符串、数字或者二进制,但值最大不能超过512MB。

redis 提前缓存热点数据 redis如何存储热点数据_缓存

3.1.1 常用的指令

## 设置/修改值,如果 key 存在则进行修改
set key value

## 取值
get key

## 批量添加值
mset k1 v1 [k2 v2 k3 v3...]

## 自增和自建
incr key ## 在key对应的value上自增
desr key ## 在key对应的value上自减

## 加减操作
incrby key v ## 在key对应的value上加v
desrby key v ## 在key对应的value上加v

## 添加键值对,并且设置键值对的过期时间(TTL)
setex key time(seconds) value

## 添加键值对,key 不存在才添加成功,key 不存在则添加失败
setnx key value

## 在指定的 key 所对应的 value 之后拼接字符串
append key value

## 获取指定 key 对应的字符串的长度
strlen key

3.2 Hash

Hash 是一个键值对集合

redis 提前缓存热点数据 redis如何存储热点数据_缓存_02

3.2.1 常用的指令

## 先 key 对应的 hash 中添加键值对
hset key field value

## 从 key 对应的hash获取 field 对应的值
hget key field

## 向 key 对应的 hash 结构中批量添加键值对
hmset key f1 v1 [f2 v2 ...]

## 从 key 对应的 hash 中批量获取值
hmget key f1 [f2 f3 ...]

## 在 key 对应的 hash 中 field 对应的 value 上加 v
hincrby key field v

## 在 key 对应的 hash 中的所有键值对
hgetall k1

## 获取 key 对应的 hash 中所有的 field
hkeys k1

## 获取 key 对应的 hash 中所有的 value
hvals key

## 检查 key 对应的 hash 中是否有指定的 field
hexists k1 field

## 获取 key 对应的 hash 中键值对的个数
hlen key

## 向 key 对应的 hash中添加键值对,如果键在hash中已经存在,则添加失败
hsetnx key field value

3.3 list

有序可重复的集合,底层是依赖双向链表实现的。

list 数据结构,支持从俩测进行存取数据

同侧存储:实现堆栈结构,后进先出

异侧存取:实现了队列结构,先进先出

redis 提前缓存热点数据 redis如何存储热点数据_redis 提前缓存热点数据_03

3.3.1 常用的指令

## 存取数据
lpush key value # 在 key 对应的列表的左侧添加数据 value
rpush key value # 在 key 对应的列表的右侧添加数据 value

## 取数据
lpop key # 从 key 对应的列表的左侧去一个值
rpop key # 从 key 对应的列表的右侧取一个值

## 修改数据
lset key index value # 修改 key 对应的列表的索引位置的数据 (索引从左到右)

## 查看 key 对应的列表中索引从 start 开始到 stop 结束的所有值
lrange key start stop

## 查看 key 对应的列表中 index 索引对应的值
lindex key index

## 获取 key 对应的列表中的元素个数
len key

## 从 key 对应的列表中截取 key 在[start,stop]范围的值,不在此访问的数据全部清除
ltrim key start stop 

## 用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回。
rpoplpush k1 k2

3.4 set

无序去重的集合。Set 提供了交集、并集等方法,对于实现共同好友、共同关注等功能特别方便。

redis 提前缓存热点数据 redis如何存储热点数据_redis_04

3.4.1 常用的指令

## 存储元素,在 Key 对应的集合中添加元素,可以添加一个,也可以同时添加多个元素
sadd key v1 [v2 v3 v4 ..]

## 编译 key 对应的 set 中的所有元素
smembers keys

## 随机从 key 的集合中去一个值
spop key

## 交集
sinter key1 key2

## 并集
sunion key1 key2

## 差集
sdiff key1 key2

## 从 key 对于的集合中移除指定的 value
srem key value

## 检查 value 成员元素是否是set的成员
sismember key value

3.5 SortedSet

有序Set。内部维护了一个 score 的参数来实现。适用于排行榜和带权重的消息队列等场景。

3.5.1 常用的指令

## 存储数据( socre 存储位置必须是数值,可以是float类型的任意数字,member 元素不允许重复)
zadd key score member [score member...]

## 查看 key 对于有序集合中索引[start,stop]数据——按照score值由小到大
zrange key start top

## 查看 member 元素在 key 对于有序集合中的索引
zscore key member

## 获取 key 对于 zset 中的元素个数
zcard key

## 获取 key 对于 zset 中,score 在[min,max]范围内的member个数
zcount key min max

## 从 key 对应的 zset 中移除指定的 member
zrem key member

## 查看 key 对应的有序集合中索引[start,stop]数据——按照 score 值由大到小
zrevrange key start stop

3.6 key相关的指令

## 查看 redis 中满足 pattern 规则的所有 key(keys *)
keys pattern

## 查看指定 key 是否存在
exists key

## 删除指定键值对对
del key

## 获取当前 key 的存活时间(如果没用设置过期翻译-1,设置过期并且已经过期返回-2)
ttl key

## 设置键值对过期时间
expire key seconds
pexpiree key milliseconds

## 取消键值对过期时间
persist key