Redis基础知识点总结
关系型数据库 VS ⾮关系型数据库(NoSQL)
关系型数据库
我们过去使⽤的 mysql、Oracle 都属于关系型数据库。关系型数据库的特点是数据表之间可以存在联系,表内每列数据也存在关联,同时⽀持事务、复杂的锁机制,这样可以⽀持复杂操作,在查询时也可以很快得到与之相关联的数据,但同时这些也成为限制数据库速度的因素,在存储⼤数据的表中进⾏查询修改、拓展表时会格外消耗时间。在过去受硬件⽔平的限制,系统架构往往⽐较简单,并发量也⽐较⼩,但随着硬件⽔平的提⾼,系统变得越拉越庞⼤,需要存储的数据量也越来越⼤,很多业务都需要在海量数据中快速查到所需要的数据,此时靠关系型数据库已经⽆法满⾜了,所以提出了⾮关系型数据库的概念。
⾮关系型数据库
⾮关系型数据库中的数据间没有关联关系,数据结构简单,在数据的增删改查时速度都⽐较快,缺点是不能⽀持复杂的操作,⽐如事务的ACID、复杂的锁机制,也因为数据间没有关联关系所以在查询符合条件的数据会很快。所以我们通常只使⽤ NoSQL 来存储⼀些简单、不需要复杂操作的数据,如某个⽤户的粉丝数,某个博客的点赞数、字数等。
四种聚合模型
总结
传统的关系型数据库因为内部功能多,数据间存在关联,导致在数据量过⼤时操作起来效率⽐较低。⾮关系型数据库则与之相反从⽽得到了很好的性能,在⽇益要求性能的今天起到了很好的作⽤,但是因为其不能实现复杂功能,所以对于⼀些需要复杂操作(读写锁、事务、多表联查等)还是使⽤关系型数据库,⽽对于⼀些简单数据,不需要太复杂操作的可以使⽤⾮关系型数据库。
Redis
redis 是⼀个单线程(底层使⽤IO多路复⽤模型)分布式数据库,也是⼀个典型的 NoSQL,它的执⾏效率⾮常⾼,其原因主要有以下⼏点:
1、是⾮关系型数据库,数据结构简单,且没有复杂的关联关系。
2、单线程操作,避免了多线程之间切换和竞争,并通过IO多路复⽤模型来避免传统 BIO 的低效执⾏。
3、数据存储在内存,读取时直接从内存中读取。
基础知识
1、在安装后相应的执⾏命令和配置⽂件默认在 /usr/local/bin/ ⽬录下
2、redis 默认有 16个数据库,0-15,默认是0号数据库,可以通过 " select 数据库号"  来切换数据库。数据库个数可以在 f 中配置。
3、redis 是统⼀密码管理,默认情况下没有开启密码,可以在配置⽂件 f 中配置开启
4、默认端⼝是 6379。
5、启动服务器:redis-server  配置⽂件全路径。配置⽂件可以是⾃定义的配置⽂件。启动客户端:redis -cli -p  6379。
五⼤基本数据类型及常⽤⽅法
String
最基本的数据类型,虽然为 String 类型,但是其 value 可以为 string 也可以为 int 类型。其可以⽤于实现计数器,也可以⽤于进⾏ json 格式的对象存储。
常⽤⽅法:
set / get / del / append / strlen :  设值 / 获值 / 删值 / 末尾添加值 / 获取长度
Incr / decr / incrby key n / decrby key n:  ⾃增 / ⾃减 / 增加 n / 减去 n
getrange  n1  n2 / setrange  n1  n2  val:  截取下标n1,n2之间的值(从0开始,两边都是闭区间) / 设置下标n1,n2区间的值
setex  key  time  val / setnx  key  val:  设值并指定过期时间(单位为秒) / 在 val 不存在或者已过期时设值
mset / mget / msetnx:  批量(进⾏设置  /  获值 / ⾮空设值)
List
底层是链表结构,⽅法名开头的 l 表⽰ left,r 表⽰ right。可以⽤于实现消息队列、⽂章列表。
常⽤⽅法:
lpush / rpush / lrange n1 n2:  左添 / 右添 / 从左开始截取下标n1,n2之间的内容(0开始,两边都是闭
区间)
lpop / rpop:  类似于消息队列和栈的出栈操作,分别是(左出栈 / 右出栈)
lindex:  从左边计算获取指定下标的值
lrem key n  value:  对 key 对应的 list 数据从左边开始删除 n 个 value
ltrim  key  n1  n2:  获取 key 对应的 list 值,截取 n1 到 n2 之间的值再赋值覆盖当前的 list 值。
rpoplpush  list1  list2:  将list1中的右边尾部数据移到 list2 的左边头部
lset  key  index  value:  左边开始修改指定索引上的值
linsert  key  before/after  val1  val2:  从左开始,获取第⼀个 val1,在其(左 / 右) 插⼊ val2   
Set
和 java 中的 Set 集合⼀样,唯⼀⽆需的结构。可以⽤来存储好友,然后计算共同好友;抽奖,随机pop出栈元素。
常⽤⽅法:
sadd / smembers / sismember key val:  添加(可以批量添加) / 显⽰所有值 / 查看是否存在val
scard key:  获取集合中元素的个数
srem key val:  删除某个元素
scrandmember  key  n:  随机出 n 个元素(不会从集合中移除改元素)
spop key:  随机出栈⼀个元素(会从集合中移除该元素)
smove key1  key2  key1中的某个值val:  将 key1 对应集合中的某个值val 移⼊ key2 对应的集合中
sdiff  key1  :  获取存在与于key1 对应集合中但不存在后⾯所有key对应集合中的元素
sinter key1  :  获取存在于 key1 对应的集合中且存在于后⾯所有key对应集合中的元素
sunion  key1  :  获取存在于 key1 对应的集合中或者存在于后⾯所有key对应集合中的元素
Hash
类似于 java 中的 Map 结构,可以⽤于存储对象。
常⽤⽅法:
hset / hget / hmset / hmget / hgettall  key/ hdel  key  key(hash):  设值 / 获值 / 批量设值 / 批量获取 / 获取 key 对应所有的键值对数据 / 删除 key 对应 hash 结构中的 key(hash) 对应的值。
hlen  key :  获取元素个数
hexists  key  key(hash):  查看 key 对应 hash 结构的 key(hash) 对应的值是否存在
hkeys key / hvals key:  获取 key 对应 hash 结构所有(key 值 / val 值)
hincrby key  key(hash)  val / hincrbyfloat  key  key(hash)  val:  对 key 对应 hash 结构中的 key(hash) 对应的值添加(整数 / ⼩数) val
hsetnx  key  key(hash)  val:  不存在时赋值
ZSet
每个数据关联⼀个分数,排序时会按分数升序排列,相当与⼀个有序 Set。可以⽤于实现各种排⾏榜。
常⽤⽅法:
zadd  key  score  val / zrange  key  n1  n2  withscores:  添加 / 获取所有值
zrangebysorce key score1 score2:  查 score1 与 score2 之间的数据
zrem key val:  删除某个值
zcard key / zcount key score1  score2 / zrank key value / zscore key value:  获取数据数 / 统计在 score1 与 score2 之间元素的个数 / 获取指定数据所在下标 / 获取指定数据的分数zrevrant key value:  逆序获取指定值的下标
zrevrangebyscore key score1 score2:  逆序获取 score1 与 score2 之间的数据
Key 及其他操作⽅法
keys  *:  获取所有的key
exists  key:  查看是否存在key,返回1是存在,0不存在
expire key  时间:  为 key 设置过期时间,单位是秒
ttl  key:  查看 key 还有多久过期,-1表⽰永不过期,-2表⽰已过期。
type  key:  查看 key 是什么类型redis支持的五种数据类型
Dbsize:  查看当前数据的 key 数量
Flushdb:  清除当前库中的所有数据
Flushall:  清除所有库中的所有数据
配置⽂件 f(Linux)
下⾯列出的各个配置可能存在多出,因为参考了多个版本的配置⽂件,同时可能存在遗漏,请见谅。修改配置⽂件的原则是不要动默认的配置⽂件,应该将默认配置⽂件复制⼀份到指定⽬录,然后去处理,防⽌修改错误⽆法恢复。
Units:配置⼤⼩单位,可以⽤于⾃定义⼀些度量单位,底层单位只⽀持 bytes,⼤⼩写不敏感。
includes:可以来引⼊其他配置⽂件
general:
  Daemonize:  是否以守护进程的⽅式运⾏,默认为no,也就是服务器窗⼝关闭后就会关闭服务器,如果需要后台运⾏可以设置为 yes。
  protected-mode:  保护模式是否开启,默认是 yes。关闭其他任何ip 地址都可以来访问连接,关闭后必须通过 bind 来配置相应的 ip 后,其才能连接。
  Pidfile:  如果 redis 以守护进程的⽅式运⾏时,系统就会将这个守护进程的 id 记录下来,记录的位置就是通过 Pidfile 来配置,默认是 /var/run/redis.pid
  Port:  端⼝端⼝号
  Tcp-backlog:  设置 tcp 的连接队列长度,其值 = 未完成三次握⼿队列 + 已完成三次握⼿队列。默认是 511,如果并发量⽐较⼤时可以设置为 2048。
  timeout:  设置最⼤空闲时间,也就是多久没有操作服务器就会⾃动断开。默认是0,也就是永不断开。
  Bind:  设置允许访问的 ip 地址,在 protected-mode 为 yes 时使⽤。
  tcp-keepalive:  服务器会检测客户端是否还在使⽤,如果⼀段时间内客户端没有操作,那么 redis 服务器就会释放这条连接,tcp-keepalive 就是设置客户端的最⼤空闲时间的,默认是0,也就是永不断开,⽽官⽅推荐是 60,也就是超过60秒没操作服务器就会回收这⼀条的连接。
  loglevel:  ⽇志级别。从⾼到低分别为 warning、notice、verbose、debug。默认是 notice。
  logfile:  ⽇志⽂件存放位置。
  Syslog-enable:  是否把输出⽇志保存到⽇志⽂件中。默认关闭
  Syslog-ident:  设置⽇志中的⽇志标识。
  Syslog-facility:  指定输出 syslog 的设备,可以为 user 或 local0-local7。
  Databases:  设置数据库个数。默认16
  always-show-logo:  是否总是显⽰ logo,默认 yes。
REPLICATION(主从复制相关):
  ⼀般配置主从复制时,需要⾃⼰⼿动通过 salveof 命令来配置从机,⽽如果各机器事先就决定好⾓⾊,可以直接在配置⽂件中配置来避免⼿动配置。
  masterip:  主机的 ip 地址
  masterport:  主机的端⼝号
  masterpassword:  主机的密码
SNAPAHOTTING快照(RDB相关):
  save :  设置RDB⾃动备份的时间间隔,save 配置的格式是 "save  时间间隔次数",默认配置是
    save  900  1
    save  300  10
    save  60  10000
从第⼀⾏开始作⽤分别是在 900s 内执⾏了⼀次写操作就会触发⼀次备份;300s 内执⾏了 10次写操作就会触发⼀次备份;60s 内执⾏了10000次写操作就会触发⼀次备份。
⼀般来说使⽤默认配置就可以,如果想要禁⽤⾃动备份可以将其删除或者改成 save ""。
  Stop-writes-on-bgsave-error:  通过bgsave备份出错时,主线程是否继续⼯作。
  rdbcompression:  是否压缩 rdb⽂件,需要消耗⼀些 cpu 资源。压缩会使⽂件占⽤空间减⼩。
  rdbchecknum:  存储快照后是否进⾏数据校验。如果想要提⾼执⾏效率可以关闭。
  dbfilename:  备份的⽂件名。默认是 dump.rdb。
  dir:  RDB、AOF 备份⽂件的存储地址。在服务器启动时恢复数据也会在 dir 配置的⽬录中读取对应的备份⽂件。默认在执⾏⽬录下。可以通过 "config  get  dir" 获取 dir 。
APPEND ONLY MODE追加(AOF相关)
  appendonly:  是否启⽤AOF。
  appendfilename:  备份⽂件的⽂件名,默认为 appendonly.aof。
  appendfsync:  存储策略。共有以下三种。
    always:同步持久化,每次写操作后都会⽴刻记录到磁盘,性能较差但是数据完整性最好。
    everysec:异步操作,每⼀秒执⾏⼀次记录,可能会有少量数据丢失。
    no:不进⾏记录。
  No-appendfsync-on-rewrite:  rewrite 时是否执⾏存储策略(进⾏存储)。⼀般使⽤默认 no 即可,保证数据安全性。
  Auto-aof-rewrite-min-Size:   设置 rewrite 触发的最⼩基准值。
  Auto-aof-rewrite-percentage:  设置 rewrite 触发的超出百分⽐基准值。
Security(安全权限相关)
默认情况下,安全权限是关闭的,在客户端连接时不需要输⼊密码,执⾏操作也不需要密码,但是如果开启了安全检测,那么所有客户端在执⾏命令时都需要先执⾏ "auth 密码" 来验证⾝份。
可以在配置⽂件中配置 "requirepass  密码" 来配置密码,也可以在命令⾏执⾏ "config  set  requirepass  密码" 来配置,查看密码可以使⽤ "config  get  requirepass"。如果想要关闭可以直接在命令⾏执⾏ "config  set  requirepass "" " 。
limit
  maxclients:  最⼤连接的客户端数,默认⽆限制,下同。
  maxmemory:  redis 服务器占⽤的最⼤内存。默认⽆限制,推荐是最⼤内存的四分之三。单位 byte 。 1024 * 1024 * 100 byte = 100MB。可以通过 info memory 来查看 redis 内存使⽤情况
  maxmemory-policy:  redis 内存淘汰策略。类似与线程池的拒绝策略,就是当存储新数据时内存空间不⾜执⾏的操作。策略主要有以下六种。
    1)volatile-lru:使⽤ LRU 算法移除 key,只对设置了过期时间的键
    2)allkeys-lru(常⽤):使⽤ LRU 算法移除 key。
    3)volatile-random:在过期集合中移除随机的 key,只对设置了过期时间的键
    4)allkeys-random:移除随机的 key。
    5))volatile-ttl:移除那些 TTL 最⼩的 key,即那些最先要过期的 key
    6)noeviction(默认):不进⾏移除。针对写操作,只是返回错误信息。
    7)allkeys-lfu:使⽤ LFU 算法移除 key
    8)volatile-lfu:使⽤ LFU 算法移除 key,只对设置了过期时间的键
    LRU 算法就是被使⽤的数据会被移到头部,未使⽤的就会慢慢向尾部靠近,在移除时从尾部移除。
    LFU 算法是按频率排列,频率低的移到尾部,频率⾼的移到头部。
  maxmemory-samples:  设置样本数。在清除时,因为LRU算法和最⼩TTL算法都并⾮是精确的算法,⽽是估算值,所以我们可以设置⼀个具体的⼤⼩,redis会抽出这个数量的数据并根据算法进⾏清除。
redis 删除策略
定时删除:在 key 到达过期时间后,就会⽴刻删除。优点是可以最⼤程度利⽤内存,缺点是每次删除都需要调⽤CPU,在过期数据多时CPU调⽤次数过于频繁,影响CPU执⾏业务代码效率。
惰性删除:在 key 过期后,不会删除,完全依靠配置⽂件 maxmemory-plicy 配置的内存淘汰策略来在内存不⾜时删除。优点是对 CPU 友好,缺点是对内存不友好,可能会浪费⼤量的内存。
定期删除:是前两种的折中⽅案,可以通过添加 "  hz  10 " (默认配置也是10)来选择⼀秒钟执⾏定期删除的次数。定期删除会进⾏随机抽样,删除抽样中已过期的 key ,同时会消耗规定峰值以下的 C
PU,不影响业务代码的效率。但是这样还是会遗漏⼀部分已过期的 key (⼀直未被随机抽样到),那么就需要依靠前⾯的内存淘汰策略了。
RDB
默认的持久化⽅式。其本质就是保存当前时刻的数据快照。默认⽣成⽂件名是 dump.rdb。
默认会在⼀段时间内⾃动保存数据,规则就是上⾯配置⽂件 RDB 部分 save 的配置。需要注意的是,RDB 的持久化⽅式分为 save 与 bgsave。
save 是中断当前进程,然后进⾏持久化操作,等到持久化完成后再继续执⾏其他操作;
bgsave 是 fork ⼀个⼦进程,fork 出来的⼦进程会拥有当前进程所有的内存数据,然后⼦进程单独进⾏持久化操作,不会阻塞当前进程执⾏。
RDB 持久化触发时机
1、来⾃配置⽂件中配置的⾃动备份,也就是上⾯说得 save。其实现⽅式是 bgsave。
2、执⾏命令 save 或 bgsave。执⾏ save 就是中断状态来实现的;⽽ bgsave 则是 fork ⼦进程来实现,不会中断当前进程执⾏。
3、执⾏flushdb、flushall、shutdown 命令后在命令⽣效前也会先备份⼀次。其实现⽅式是 save。
RDB ⽂件恢复
默认情况下只需要将备份⽂件放在启动⽬录下然后在启动⽬录下启动服务器即可。
启动⽬录指的是启动 redis-server 命令的⽬录,在备份时会⾃动备份到该⽬录下,⽐如在 /temp/ 启动,那么默认会读取该⽬录下的 dump.rdb ⽂件,备份也会在该⽬录,如果下次启动在/myredis/ 下,那么也会读取 /myredis/下的 dump.rdb ⽂件,备份数据也是会在该⽬录下备份。这个⽬录也可以⾃定义,配置参数是 f 中 dir 参数。
如何关闭 RDB 的⾃动备份
可以在配置⽂件中将 save 改成 save "",也可以直接执⾏ " redis-cli config set save ""  "
优势
1、执⾏效率⾼,适⽤于⼤规模数据的备份恢复。⾃动备份不会影响主线程⼯作。
2、备份的⽂件占⽤空间⼩。其备份的是数据快照,相对于 AOF 来说⽂件⼤⼩要⼩⼀些。
劣势
1、可能会造成部分数据丢失。因为是⾃动备份,所以如果修改的数据量不⾜以触发⾃动备份,同时发⽣断电等异常导致 redis 不能正常关闭,所以也没有触发关闭的备份,那么在上⼀次备份到异常宕机过程中发⽣的写操作就会丢失。
2、⾃动备份通过 fork 进程来执⾏备份操作,⽽ fork 进程会将当前进程的内存数据完整的复制⼀份,所以这个过程占⽤的空间是原来的 2 倍,可能会导致内存不⾜。
AOF
AOF 是在 RDB 的补充备份⽅式,其本质是保存执⾏的每⼀条写操作(包括flushdb、flushall),所以其产⽣的备份⽂件是可以直接阅读的。默认备份⽂件名是 appendonly.aof,保存位置和 RDB 备份⽂件⼀样。因为其保存的是每⼀条写操作,所以会⽐较占⽤ CPU,同时⽣成的备份⽂件也⽐较占空间,所以默认是关闭的。使⽤时需要在配置⽂件中将其打开。AOF 持久化规则
AOF 备份也是采⽤⾃动备份,但是备份的频率会⽐ RDB 要⾼,其备份⽅式分为三种:
1、always:同步持久化,每次写操作后都会⽴刻记录到磁盘,性能较差但是数据完整性最好。
2、everysec(默认):异步操作,每⼀秒执⾏⼀次记录,可能会有少量数据丢失,但是性能更好。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。