Redis介绍

    xiaoxiao2022-07-07  151

    一.redis简介

    Remote Dictionary Server(Redis)是一个开源的使用 ANSI C 语言编写、支持网络、可 基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

    二.redis的特点

    2.1 优点

    支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash 表)、set(集合)、 zset(排序 set)、hyperloglog(基数估算)支持持久化操作,可以进行 aof 及 rdb 数据持久化到磁盘,从而进行数据备份或数 据恢复等操作,较好的防止数据丢失的手段。支持通过 Replication 进行数据复制,通过 master-slave 机制,可以实时进行数据的 同步复制,支持多级复制和增量复制,master-slave 机制是 Redis 进行 HA 的重要手段。单进程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。

    三.为什么要用redis缓存

    从高性能方面看:

    如果用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。当数据库中的对应数据改变的之后,同步改变缓存中相应的数据!

    2.从高并发上来看 将数据库中的部分数据存到缓存中,当用户请求数据时,不用经过数据库,可以提高效率。

    四.redis的优势

    redis支持更丰富的数据类型:Redis不仅仅支持简单的key/value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

    Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用.

    集群模式:redis支持 cluster 模式的.

    Redis使用单线程的多路 IO 复用模型。

    五.redis常见的数据类型

    5.1 1String(字符串)

    Redis 字符串是字节序列。Redis 字符串是二进制安全的,这意味着他们有一个已知的 长度没有任何特殊字符终止,所以你可以存储任何东西,512 兆为上限 示例: redis 127.0.0.1:6379> SET name kevin OK redis 127.0.0.1:6379> GET name “kevin”

    incr 让当前键值以 1 的数量递增,并返回递增后的值 incrby 可以指定参数一次增加的数值,并返回递增后的值 decr 让当前键值以 1 的数量递减 并返回递减后的值 decrby 可以指定参数一次递减的数值,并返回递减后的值 incrbyfloat 可以递增一个双精度浮点数 append 作用是向键值的末尾追加 value。如果键不存在则将该键的值设置为 value。返 回值是追加后字符串的总长度。 mget/mset 作用与 get/set 相似,不过 mget/mset 可以同时获得/设置多个键的键值 del 根据 key 来删除 value flushdb 清除当前库的所有数据

    5.2 Hash(hash 表)

    Redis 的哈希是键值对的集合。 Redis 的哈希值是字符串字段和字符串值之间的映射,因此它们被用来表示对象.

    示例: redis 127.0.0.1:6379> HSET key field value OK redis 127.0.0.1:6379> HGET key field value

    5.3 List(链表)

    Redis 的链表是简单的字符串列表,排序插入顺序。您可以添加元素到 Redis 的列表的头部或尾部

    示例: redis 127.0.0.1:6379> lpush tutoriallist redis (integer) 1 redis 127.0.0.1:6379> lpush tutoriallist mongodb (integer) 2 redis 127.0.0.1:6379> lpush tutoriallist rabitmq (integer) 3 redis 127.0.0.1:6379> lrange tutoriallist 0 10

    “rabitmq”“mongodb”"redis lpush key value 向链表左侧添加 rpush key value 向链表右侧添加 lpop key 从左边移出一个元素 rpop key 从右边移出一个元素 llen key 返回链表中元素的个数 相当于关系型数据库中 select count(*) lrange key start end lrange 命令将返回索引从 start 到 stop 之间的所有元素。Redis 的列 表起始索引为 0。 lrange 也支持负索引 lrange nn -2 -1 如 -1 表示最右边第一个元素 -2 表示最右边第二 个元素,依次类推。 lindex key indexnumber 如果要将列表类型当做数组来用,lindex 命令是必不可少的。 lindex 命令用来返回指定索引的元素,索引从 0 开始 如果是负数表示从右边开始计算的索引,最右边元素的索引是-1。 Lset key indexnumber value 是另一个通过索引操作列表的命令,它会将索引为 index 的元素赋值为 value。

    5.4 Set(集合)

    Redis 的集合是字符串的无序集合。

    示例: redis 127.0.0.1:6379> sadd tutoriallist redis (integer) 1 redis 127.0.0.1:6379> sadd tutoriallist mongodb (integer) 1 redis 127.0.0.1:6379> sadd tutoriallist rabitmq (integer) 1 redis 127.0.0.1:6379> sadd tutoriallist rabitmq (integer) 0 redis 127.0.0.1:6379> smembers tutoriallist

    “rabitmq”“mongodb”“redis”

    sadd key value 添加一个 string 元素到,key 对应的 set 集合中,成功返回 1,如果元素已经 在集合中返回 0 scard key 返回 set 的元素个数,如果 set 是空或者 key 不存在返回 0 smembers key 返回 key 对应 set 的所有元素,结果是无序的 sismember key value 判断 value 是否在 set 中,存在返回 1,0 表示不存在或者 key 不存 在 srem key value 从 key 对应 set 中移除给定元素,成功返回 1,如果 value 在集合中不存 在或者 key 不存在返回 0

    5.5 SortedSet(排序集合)

    Redis 的有序集合类似于 Redis 的集合,字符串不重复的集合。

    示例: redis 127.0.0.1:6379> zadd tutoriallist 0 redis (integer) 1 redis 127.0.0.1:6379> zadd tutoriallist 0 mongodb (integer) 1 redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq (integer) 1 redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq (integer) 0 redis 127.0.0.1:6379> ZRANGEBYSCORE tutoriallist 0 1000

    “redis”“mongodb”“rabitmq”

    zadd key score value 将一个或多个 value 及其 socre 加入到 set 中 zrange key start end 0 和-1 表示从索引为 0 的元素到最后一个元素(同 LRANGE 命令 相似) zrange key 0 -1 withscores 也可以连同 score 一块输出,使用 WITHSCORES 参数 zremrangebyscore key start end 可用于范围删除操作

    5.6 redis的其他命令

    ping 测试 redis 是否链接 如果已链接返回 PONG echo value 测试 redis 是否链接 如果已链接返回 echo 命令后给定的值 keys * 返回所有的 key 可以加*通配 exists key 判断 string 类型一个 key 是否存在 如果存在返回 1 否则返回 0 expire key time(s) 设置一个 key 的过期时间 单位秒。时间到达后会删除 key 及 value ttl key 查询已设置过期时间的 key 的剩余时间 如果返回-2 表示该键值对已经被删除 persist 移除给定 key 的过期时间 select dbindex 选择数据库(0-15) move key dbIndex 将当前数据库中的 key 转移到其他数据库中 dbsize 返回当前数据库中的 key 的数目 info 获取服务器的信息和统计 flushdb 删除当前选择的数据库中的 key

    六.redis 持久化机制(怎么保证 redis 挂掉之后再重启数据可以进行恢复)

    很多时候我们需要持久化数据也就是将内存中的数据写入到硬盘里面,大部分原因是为了之后重用数据(比如重启机器、机器故障之后恢复数据),或者是为了防止系统故障而将数据备份到一个远程位置。 Redis支持持久化,而且支持两种不同的持久化操作。Redis的一种持久化方式叫快(snapshotting,RDB),另一种方式是只追加文件(append-only file,AOF)。这两种方法各有千秋,下面我会详细这两种持久化方法是什么,怎么用,如何选择适合自己的持久化方法。

    快照(snapshotting)持久化(RDB) 对内存中数据库状态进行快照 RDB 方式:将 Redis 在内存中的数据库状态保存到磁盘里面,RDB 文件是一个经过压 缩的二进制文件,通过该文件可以还原生成 RDB 文件时的数据库状态(默认下,持久化到 dump.rdb 文件,并且在 redis 重启后,自动读取其中文件,据悉,通常情况下一千万的字 符串类型键,1GB 的快照文件,同步到内存中的 时间是 20-30 秒)

    快照持久化是Redis默认采用的持久化方式

    ** AOF(append-only file)持久化** AOF 持久化方式在 redis 中默认是关闭的,需要修改配置文件开启该方式。 AOF:把每条命令都写入文件,类似 mysql 的 binlog 日志 AOF 方式:是通过保存 Redis 服务器所执行的写命令来记录数据库状态的文件。 AOF 文件刷新的方式,有三种: appendfsync always - 每提交一个修改命令都调用 fsync 刷新到 AOF 文件,非常非常 慢,但也非常安全 appendfsync everysec - 每秒钟都调用 fsync 刷新到 AOF 文件,很快,但可能会丢失 一秒以内的数据 appendfsync no - 依靠 OS 进行刷新,redis 不主动刷新 AOF,这样最快,但安全性就 差 默认并推荐每秒刷新,这样在速度和安全上都做到了兼顾 AOF 数据恢复方式 服务器在启动时,通过载入和执行 AOF 文件中保存的命令来还原服务器关闭之前的数 据库状态,具体过程: 载入 AOF 文件 创建模拟客户端 从 AOF 文件中读取一条命令 使用模拟客户端执行命令 循环读取并执行命令,直到全部完成 如果同时启用了 RDB 和 AOF 方式,AOF 优先,启动时只加载 AOF 文件恢复数据

    七.如何保证缓存与数据库双写时的数据一致性?

    一般来说,就是如果你的系统不是严格要求缓存+数据库必须一致性的话,缓存可以稍微的跟数据库偶尔有不一致的情况,最好不要做这个方案,读请求和写请求串行化,串到一个内存队列里去,这样就可以保证一定不会出现不一致的情况 串行化之后,就会导致系统的吞吐量会大幅度的降低,用比正常情况下多几倍的机器去支撑线上的一个请求。

    最新回复(0)