分布式数据存储 之 Redis(一) —— 初识Redis

为什么要学习并运用Redis?Redis有什么好处?我们步入Redis的海洋,初识Redis。

一、Redis是什么

​ Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。(来自官方的官方的解释!)

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

二、Redis的运用场景

​ 1.高频访问

​ 2.热点数据

​ 3.固定不变的数据

​ 4.读写比列读操作较高的数据

​ 注:等等,还有更多的运用场景,这是Redis特性所决定的!

三、Redis可以做什么

​ 1.数据库

​ 2.缓存

​ 3.消息中间件

​ 4.注册中心

​ 5.分布式锁 (另一种实现方式:zookeeper)

四、Redis常见的数据结构

​ Redis支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和地理空间(geospatial) 索引半径查询。

1.strings

字符串

常用命令

1.设置或获取值

​ 通常用SET command 和 GET command来设置和获取字符串值

​ 例:

> set mykey somevalue
OK
> get mykey
"somevalue"

​ 参数:

​ ex :
​ 过期时间(秒)
​ nx :
​ 当key存在时SET会失败,或相反的,当key不存在时它只会成功。

​ 2.修改或查询键空间

​ 1.判断是否存在

​ exists

​ exists mykey

​ 返回1或0标识给定key的值是否存在

​ 2.删除

​ del

​ del mykey

​ 返回1或0标识值是被删除(值存在)或者没被删除(key对应的值不存在)

​ 3.查看存储类型

​ type

​ type myket

​ 返回key对应的值的存储类型

3.Redis超时:数据在限定时间内存活

​ expire

​ expire key 5

​ 设置超时时间,也可再次强调改变超时时间

​ 使用 PERSIST 命令去除超时时间

​ 参数

​ ex
​ set key 100 ex 10

​ 在创建值的时候设置超时时间

​ ttl

​ ttl key

​ 查看key对应的值剩余存活时间

4.转换为 整型

​ incr

​ incr mykey

​ 将key 转换为 整型

2.hashes

散列

​ 数据结构类似于Map<Object,Map<Object,Object>>

​ 看起来就像一个 “hash” 的样子,由键值对组成

常用命令

​ hmset

​ hmset person name admin age 10

​ 设置 hash 中的多个域

​ hget

​ hget person age

​ 取回单个域

​ 例:

> hmset person name admin age 10
OK
> hget person age
"10"

3.lists

列表

常用命令

​ lpush

​ rpush mylist A

​ 向list的左边(头部)添加一个新元素

​ rpush

​ lpush mylist first

​ 向list的右边(尾部)添加一个新元素

​ lrange

​ lrange mylist 0 -1

​ 从list中取出一定范围的元素
​ 注:
​ 带有两个索引,一定范围的第一个和最后一个元素
​ 从尾部开始计数,因此-1表示最后一个元素,-2表示list中的倒数第二个元素,以此类推。

​ rpop

​ rpop mylist

​ 从list中删除元素并同时返回删除的值。可以在左边或右边操作。

​ 例:

> lpush list 1
(integer) 1
> rpush list 3
(integer) 2
> lrange list  0 10
6) "1"
7) "3"
> rpop list
"3"

4.sets

集合

​ 更适合不重复的数据类型

常用命令

​ sadd

​ sadd myset 1 2 3

​ 把新的元素添加到 set 中

​ smembers

​ smembers myset

​ 查看

​ 例:

127.0.0.1:6379> sadd myset 1 2 3
(integer) 3
127.0.0.1:6379> smembers myset
1) "1"
2) "2"
3) "3"

五、事务

​ MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事务相关的命令。事务可以一次执行多个命令, 并且带有以下两个重要的保证:

  • 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  • 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

命令

​ MULTI

​ 用于开启一个事务,它总是返回 OK

​ EXEC

​ 负责触发并执行事务中的所有命令

​ 例:

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set name 10
QUEUED
127.0.0.1:6379> set name a
QUEUED
127.0.0.1:6379> incr name
QUEUED
127.0.0.1:6379> exec 
1) OK
2) OK
3) (error) ERR value is not an integer or out of range

​ DISCARD

​ 事务放弃, 事务队列会被清空, 并且客户端会从事务状态中退出

​ 例:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name 100
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get name
"a"

​ WATCH

​ 使得 EXEC 命令需要有条件地执行
​ 可以为 Redis 事务提供 check-and-set (CAS)行为
​ 监控某些值,防止该值在十五提交过程中被其他客户端改变

WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC

# 若值为nil 说明修改失败

事务中的错误

​ 入队前

​ 大部分客户端都会停止并取消这个事务

​ 入队后

​ 命令可能在 EXEC 调用之后失败。
​ 事务正常执行,不会影响已经入队的结果

为什么 Redis 不支持回滚(roll back)

​ Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面

六、Redis 在 Docker 中的运用

操作步骤

  1. 拉去 Redis 5.0.4镜像

    docker pull redis:5.0.4

  2. 启动 Redis

    docker run --name redis -p 6379:6379 redis:5.0.4 redis-server --appendonly yes

  3. 进入Redis 容器内部

    docker exec -it redis /bin/bash

  4. 连接服务端
    redis-cli

    参数
    ​ -h hostname
    ​ -p port
    ​ -n db(0~15)Database number

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄