redis知识点总结

一、持久化

通常 Redis 将数据存储在内存中或虚拟内存中, 它是通过以下两种方式实现对数据的持
久化。
1.1. 快照方式:(默认持久化方式)
这种方式就是将内存中数据以快照的方式写入到二进制文件中 ,默认的文件名为
dump.rdb。
客户端也可以使用 save 或者 bgsave 命令通知 redis 做一次快照持久化。 save 操作是在
主线程中保存快照的, 由于 redis 是用一个主线程来处理所有客户端的请求, 这种方式会阻
塞所有客户端请求。 所以不推荐使用。 另一点需要注意的是, 每次快照持久化都是将内存数
据完整写入到磁盘一次, 并不是增量的只同步增量数据。 如果数据量大的话, 写操作会比较
多,必然会引起大量的磁盘 IO 操作,可能会严重影响性能。
注意:由于快照方式是在一定间隔时间做一次的,所以如果 redis 意外当机的话,就会
丢失最后一次快照后的所有数据修改。

1.2. 日志追加方式:
这种方式 redis 会将每一个收到的写命令都通过 write 函数追加到文件中 ( 默 认
appendonly.aof)。当 redis 重启时会通过重新执行文件中保存的写命令来在内存中重建整
个数据库的内容。 当然由于操作系统会在内核中缓存 write 做的修改, 所以可能不是立即写
到磁盘上。这样的持久化还是有可能会丢失部分修改。不过我们可以通过配置文件告 诉
redis 我们想要通过 fsync 函数强制操作系统写入到磁盘的时机。

二、Redis 虚拟内存

redis 的虚拟内存与操作系统虚拟内存不是一码事, 但是思路和目的都是相
同的。 就是暂时把不经常访问的数据从内存交换到磁盘中, 从而腾出宝贵的内存空间。 对于
redis 这样的内存数据库, 内存总是不够用的。 除了可以将数据分割到多个 redis 服务器以
外。 另外的能够提高数据库容量的办法就是使用虚拟内存技术把那些不经常访问的数据交换
到磁盘上。如果我们存储的数据总是有少部分数据被经常访问,大部分数据很少被访问, 对
于网站来说确实总是只有少量用户经常活跃。 当少量数据被经常访问时, 使用虚拟内存不但
能提高单台 redis 数据库服务器的容量,而且也不会对性能造成太多影响。
redis 没有使用操作系统提供的虚拟内存机制而是自己在用户态实现了自己的虚拟内
存机制。
主要的理由有以下两点:
1. 操作系统的虚拟内存是以 4k/页为最小单位进行交换的。而 redis 的大多数对象都远小
于 4k,所以一个操作系统页上可能有多个 redis 对象。另外 redis 的集合对象类型如
list,set 可能存在于多个操作系统页上。最终可能造成只有 10%的 key 被经常访问, 但
是所有操作系统页都会被操作系统认为是活跃的, 这样只有内存真正耗尽时操作系统才
会进行页的交换。
2. 相比操作系统的交换方式。 redis 可以将被交换到磁盘的对象进行压缩,保存到磁盘的对
象可以去除指针和对象元数据信息。一般压缩后的对象会比内存中的对象小 10 倍。这
样 redis 的虚拟内存会比操作系统的虚拟内存少做很多 IO 操作。
三、Redis 主从复制

Redis 支持将数据同步到多台从库上,这种特性对提高读取性能非常有益。
1) master 可以有多个 slave。
2) 除了多个 slave 连到相同的 master 外,slave 也可以连接其它 slave 形成图状结构。
3) 主从复制不会阻塞 master。 也就是说当一个或多个 slave 与 master 进行初次同步数据
时,master 可以继续处理客户端发来的请求。相反 slave 在初次同步数据时则会阻塞
不能处理客户端的请求。
4) 主从复制可以用来提高系统的可伸缩性 ,我们可以用多个 slave 专门用于客户端的读
请求,比如 sort 操作可以使用 slave 来处理。也可以用来做简单的数据冗余。
5) 可以在 master 禁用数据持久化,只需要注释掉 master 配置文件中的所有 save 配置, 然
后只在 slave 上配置数据持久化。

Redis 主从复制的过程介绍
当设置好 slave 服务器后,slave 会建立和 master 的连接,然后发送 sync 命令。无论是
第一次同步建立的连接还是连接断开后的重新连接, master 都会启动一个后台进程, 将数据
库快照保存到文件中,同时 master 主进程会开始收集新的写命令并缓存起来。后台进程完
成写文件后,master 就发送文件给 slave,slave 将文件保存到磁盘上,然后加载到内存恢复
数据库快照到 slave 上。接着 master 就会把缓存的命令转发给 slave。而且后续 master 收到
的写命令都会通过开始建立的连接发送给 slave。 从 master 到 slave 的同步数据的命令和从 客
户端发送的命令使用相同的协议格式。当 master 和 slave 的连接断开时 slave 可以自动重新
建立连接。如果 master 同时收到多个 slave 发来的同步连接命令,只会启动一个进程来写数
据库镜像,然后发送给所有 slave。

Redis提供了丰富的命令(command)对数据库和各种数据类型进行操作,这些command可以在Linux终端使用。在编程时,比如使用Redis 的Java语言包,这些命令都有对应的方法,比如上面例子中使用的sadd方法,就是对集合操作中的SADD命令。下面将Redis提供的命令做一总结

连接操作相关的命令

   quit:关闭连接(connection)

   auth:简单密码认证

对value操作的命令

   exists(key):确认一个key是否存在

   del(key):删除一个key

   type(key):返回值的类型

  keys(pattern):返回满足给定pattern的所有key

   randomkey:随机返回key空间的一个key

   rename(oldname, newname):将key由oldname重命名为newname,若newname存在则删除newname表示的key

   dbsize:返回当前数据库中key的数目

   expire:设定一个key的活动时间(s)

  ttl:获得一个key的活动时间

   select(index):按索引查询

   move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库

   flushdb:删除当前选择数据库中的所有key

   flushall:删除所有数据库中的所有key

对String操作的命令

   set(key, value):给数据库中名称为key的string赋予值value

   get(key):返回数据库中名称为key的string的value

   getset(key, value):给名称为key的string赋予上一次的value

   mget(key1, key2,…, key N):返回库中多个string(它们的名称为key1,key2…)的value

   setnx(key, value):如果不存在名称为key的string,则向库中添加string,名称为key,值为value

   setex(key, time, value):向库中添加string(名称为key,值为value)同时,设定过期时间time

  mset(key1, value1, key2, value2,…key N, value N):同时给多个string赋值,名称为key i的string赋值value i



对Set操作的命令

   sadd(key, member):向名称为key的set中添加元素memb

   srem(key, member) :删除名称为key的set中的元素member

  spop(key) :随机返回并删除名称为key的set中一个元素

   smove(srckey, dstkey, member) :将member元素从名称为srckey的集合移到名称为dstkey的集合

  scard(key) :返回名称为key的set的基数

   sismember(key, member) :测试member是否是名称为key的set的元素

   sinter(key1, key2,…key N) :求交集

  sinterstore(dstkey, key1, key2,…key N) :求交集并将交集保存到dstkey的集合

   sunion(key1, key2,…key N) :求并集

 sunionstore(dstkey, key1, key2,…key N) :求并集并将并集保存到dstkey的集合

   sdiff(key1, key2,…key N) :求差集

 sdiffstore(dstkey, key1, key2,…key N) :求差集并将差集保存到dstkey的集合

  smembers(key) :返回名称为key的set的所有元素

srandmember(key) :随机返回名称为key的set的一个元素

对zset(sorted set)操作的命令

   zadd(key, score, member):向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则根据score更新该元素的顺序。

   zrem(key, member) :删除名称为key的zset中的元素member

   zincrby(key, increment, member) :如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则向集合中添加该元素,其score的值为increment

   zrank(key, member) :返回名称为key的zset(元素已按score从小到大排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”

   zrevrank(key, member) :返回名称为key的zset(元素已按score从大到小排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”

   zrange(key, start, end):返回名称为key的zset(元素已按score从小到大排序)中的index从start到end的所有元素

  zrevrange(key, start, end):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的所有元素

   zrangebyscore(key, min, max):返回名称为key的zset中score >= min且score <= max的所有元素

  zcard(key):返回名称为key的zset的基数

   zscore(key, element):返回名称为key的zset中元素element的score

  zremrangebyrank(key, min, max):删除名称为key的zset中rank >= min且rank <= max的所有元素

  zremrangebyscore(key, min, max) :删除名称为key的zset中score >= min且score <= max的所有元素

   zunionstore / zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX):对N个zset求并集和交集,并将最后的集合保存在dstkeyN中。对于集合中每一个元素的score,在进行AGGREGATE运算前,都要乘以对于的WEIGHT参数。如果没有提供WEIGHT,默认为1。默认的AGGREGATE是SUM,即结果集合中元素的score是所有集合对应元素进行SUM运算的值,而MIN和MAX是指,结果集合中元素的score是所有集合对应元素中最小值和最大值。

对Hash操作的命令

  hset(key, field, value):向名称为key的hash中添加元素field<—>value

   hget(key, field):返回名称为key的hash中field对应的value

  hmget(key, field1, …,field N):返回名称为key的hash中field i对应的value

   hmset(key, field1, value1,…,field N, value N):向名称为key的hash中添加元素field i<—>value i

   hincrby(key, field, integer):将名称为key的hash中field的value增加integer

   hexists(key, field):名称为key的hash中是否存在键为field的域

   hdel(key, field):删除名称为key的hash中键为field的域

   hlen(key):返回名称为key的hash中元素个数

  hkeys(key):返回名称为key的hash中所有键

  hvals(key):返回名称为key的hash中所有键对应的value

   hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value

持久化

   save:将数据同步保存到磁盘

   bgsave:将数据异步保存到磁盘

   lastsave:返回上次成功将数据保存到磁盘的Unix时戳

   shundown:将数据同步保存到磁盘,然后关闭服务

远程服务控制

   info:提供服务器的信息和统计

   monitor:实时转储收到的请求

   slaveof:改变复制策略设置

  config:在运行时配置Redis服务器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值