redis入门

时光总嘲笑我的痴心妄想 提交于 2020-11-24 15:01:40

介绍

Redis是目前非常流行的一款NoSql数据库

对比

Redis和Memcahe是目前非常流行的两种NoSql数据库,读可以用于服务端缓存。两者有怎么样的差异呢?

  • 从现实来看 redis:单线程 memcache:多线程
  • 从存储方式来看: redis:支持数据持久化和主从备份,数据更安全 memcache:数据存于内存,没有持久化功能
  • 从功能来看: redis:除了基本的key结构外,支持多种其他复杂结构、事务等高级功能 memcache:只支持基本k-v结构
  • 从可用性看: redis:支持主从备份、数据分片、哨兵监控 memcache:没有分片功能,需要从客户端支持 可以看出,Redis相比Memcache功能更强大,支持的数据结构也比较丰富,已经不仅仅是一个缓存服务。而Memcache的功能相对单一。

一些面试问题:持久化、分片(集群)、主从、哨兵、避免缓存击穿、避免缓存雪崩、避免缓存热点key过期

指令

通过help命名可以让我们查看到Redis的指令帮助消息: 在help后面跟上空格,然后按tab键,会看到Redis对命令分组的组名: 主要包含: @generic:通用指令 @string:字符串类型指令 @list:队列结构指令 @set:set结构指令 @sorted_set:可排序的set 结构指令 @hash:hash结构指令 指令学习地址: http://redisdoc.com/index.html

类型

其中除了@generic以为的,对应了Redis中常用的5种数据类型: String:等同于java中的,Map<String,String> List:等同于java中的Map<String,List<String>> hash(哈希):是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。 Set:等同于java中的Map<String,Set<String>> Sort_set:可以排序的set 可见,Redis中存储数据结构都是类似java的map类型,Redis不通过数据类型,只是map的值得类型不同。

通用指令(@generic)

keys

获取符合规则的键名列表。 语法:keys pattern(正则表达式) 示例:keys * (查询所有的键)

del

删除key,可以删除一个或多个key,返回1,否则返回0 语法:DEL key[key…]

expire

语法:expire key seconds 作用:设置key的过期时间,超过时间后,将会自动删除该Key 返回值: 如果成功设置过期时间,返回1 如果key不存在或者不能设置过期时间,返回0

TTL

查看一个key的过期时间 语法:TTL key 返回值: 返回剩余的过期时间 -1:永不过期 -2:已经过期或不存在

persist

语法:persist key 作用:移除给定key的生存时间,将这个key从带生存时间key转换成一个不带生存时间、永不过期的Key,类似于清除生存时间了

字符串指令

字符串结构,其实是Redis中最基础的K-V结构。其键和值都是字符串。类似Java的Map<String,String> 语法 说明 SET key value 设置指定key的值 GET key 获取指定key的值 GETRANGE key start end 返回key中字符串值得子字符 INCR key 将key中存储的数字加1 INCRBY key increment 将key所存储的值加increment DECR key 将key中存储的数字减1 DECRBY key decrement 将key所存储的值减去给定的decrement APPEND key value 如果key已经存在并且是一个字符串,APPEND命令将value追加到key原来的值得末尾 STRLEN key 返回key所存储的字符串长度 MGET key1 key2… 获取所有(一个或多个)key的值 MSET key value key value … 同时设置一个或多个key-value对

hash结构命令

Redis的Hash结构类似于Java中的Map<String,Map<String,String>>,键是字符串,值是另一个映射。结构如图:

这里我们称键为key,字段名为hKey,字段值为hValue

常用指令: HSET、HSETNX和HGET(添加、获取)

HSET

  • 介绍: HSET key field value field1 value1 field2 value2:将哈希表key中的字段field的值设为value Redis Hset命令用于为哈希表中的字符赋值 如果哈希表不存在,一个新的哈希表将被创建并进行HSET操作 如果字段已经存在于哈希表中,旧值将会被覆盖
  • 返回值: 如果字段是哈希表中的一个新建字段,并且值设置成功,返回1 如果哈希表中域字段已经存在且旧值已被新值覆盖,返回0

HGET

  • 介绍:HGET key field 获取存储在哈希表中指定字段的值 Hget 命令用于返回哈希表中指定字段的值
  • 返回值:返回给定字段的值。如果给定的字段或key不存在时,返回nil

HGETALL

  • 介绍:HGETALL key获取在哈希表中指定key的所有字段和值
  • 返回值:指定Key的所有字段的名及值。返回值里,紧跟每个字段名(field name)之后是字段的值(value),所以返回值得长度是哈希表大小的两倍

HKEYS

介绍:HKEYS key获取所有哈希表中的字段

HVALS

获取哈希表中所有值 注意:这个命令不是HVALUES,而是HVALS

HDEL(删除)

Hdel命令用于删除哈希表key中的一个或多个指定字段,不存在的字段将被忽略 语法:HDEL key field1 [field2] 返回值:被成功删除字段的数量,不包括被忽略的字段

持久化

Redis有两种持久化方案:RDB和AOF

RDB

RDB是Redis的默认持久化方案。采用的是出发条件的机制,当满足一定的条件时,Redis会自动将内存中的数据全部持久化到硬盘。

条件配置

条件在redis.conf文件中配置,格式如下: save (time) (count) 当满足在time(单位是秒)时间内,至少进行了count次修改后,触发条件,进行RDB快照。例如,默认的配置如下:

基本原理

RDB的流程是这样的:

  • Redis使用fork函数来复制一份当前进程(父进程)的副本(子进程)
  • 父进程继续接收并处理请求,子进程开始把内存中的数据写入硬盘中的临时文件
  • 子进程写完后,会使用临时文件代替旧的RDB文件

AOF

AOF方式默认是关闭的,需要修改配置来开启: appendonly yes #把默认的no改成yes

基本原理

AOF持久化的策略是,把每一条服务端接收到的写命令都记录下来,每隔一定时间后,写入硬盘的AOF文件中,当服务器重启后,重新执行这些命令,即可恢复数据。 AOF文件写入的频率是可以配置的:

AOF文件重写

当记录命令过多,必然会出现对同一个Key的多次写操作,此时只需要记录最后一条即可,前面的记录都毫无意义了。因此,当满足一定条件时,Redis会对AOF文件进行重写,移除对同一个key的多次操作命令,保留最后一条。默认的触发条件:

redis集群搭建思想

有意思的集群乒乓机制

所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。 节点的fail是通过集群中超过半数的节点检测失效时才生效。 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

Redis集群提供了以下两个好处:

将数据自动切分split到多个节点的能力。 当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力。

淘汰机制,投票:容错

投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!