Redis项目实战(一)--redis基础
*2 //以下有2组命令,即GET name
$3 //redis协议中指定指令的长度 GET $4 name
2、特点及应用:
//伪代码 WATCH key isFieldExists = HEXISTS key, field if isFieldExists is 1 MULTI HSET key, field, value EXEC else UNWATCH return isFieldExists
二、 基本使用
//创建普通用户**** useradd -d /appdeploy -m appdeploy //创建用户组并加入 刚刚创建的用户**** useradd -g appdeploy -n appdeploy(可不执行) //修改文件或文件夹的权限,使新增用户可以拥有该文件的查看权限**** chmod -R 777 /usr/local/soft/elasticsearch-6.4.0/ 或者授权文件归属于另一个用户组的用户 (chown -R appdeploy:appdeploy /usr/local/soft/elasticsearch-6.4.0) //将用户添加到用户组而不脱离该用户原来的组 usermod -a -g groupA appdeploy(可不执行) //将文件夹的归属给某个组 chown root:mygroup /user/local/soft(可不执行)
前端启动:在redis的安装目录下直接启动redis-server ./redis-server 后台启动: 把/root/redis-3.0.0/redis.conf复制到/usr/local/redis/bin目录下 cp redis.conf /usr/local/redis/bin/ 修改配置文件: ./redis-server redis.conf 查看redis进程: ps aux|grep redis 如下信息: root 5190 0.1 0.3 33936 1712 ? Ssl 18:23 0:00 ./redis-server *:6379 root 5196 0.0 0.1 4356 728 pts/0 S+ 18:24 0:00 grep redis 指定端口启动(&表示后台运行) ./redis-server --port 6380&
//默认连接localhost运行在6379端口的redis服务。 ./redis-cli //指定IP和端口连接 //-h:连接的服务器的地址 //-p:服务的端口号 ./redis-cli -h 192.168.25.153 -p 6379 关闭redis: ./redis-cli shutdown //设置密码的连接方式 ./redis-cli -h 127.0.0.1 -p 6379 -a Password
incrby 同 incr 类似,加指定值 ,key 不存在时候会设置 key,并认为原来的 value 是 0 Decr 对 key 的值做的是减减操作,decr 一个不存在 key,则设置 key 为-1 Decrby 同 decr,减指定值。 Append 给指定 key 的字符串值追加 value,返回新字符串值的长度。 Strlen 取指定 key 的 value 值的长度。 persist xxx(取消过期时间) 选择数据库(0-15库) Select 0 //选择数据库 move age 1//把age 移动到1库 Randomkey随机返回一个key Rename重命名 Type 返回数据类型
6、持久化方案:
RDB:快照形式,定时且达到触发条件(配置文件的策略),redis会创建一个子进程,子进程中的所有数据和主进程中保持一致,把当前时刻的内存中的全量数据保存到磁盘(先写入到临时文件,待持久化结束后再用这个临时文件替换上次持久化的文件),Redis默认支持的持久化方案(单机环境中可以关闭,集群环境中无法关闭,集群环境中需要通过该方式进行主从节点之间数据同步)。缺点:速度快但是服务器断电的时候会丢失部分数据。
AOF:append only file。AOF模式会开辟一个AOF缓存区,在主进程中把所有对redis数据库操作的命令,增删改操作的命令,以追加的方式保存到文件中,数据库恢复时把所有的命令执行一遍即可。AOF文件来恢复数据库,能保证数据的完整性。缺点:速度慢,一个内存中数据的增删改操作就对应写入一次磁盘。
混合模式(优化重写持久化文件,使其占用空间更小):redis4.0版本之后补充了混合模式(5.0版本之后,默认开启),即,RDB模式下创建子进程将共享内存副本中当前时刻的全量数据写入AOF文件,然后在将重写缓冲区的增量命令以AOF方式写入到文件,写入完成后通知主进程更新统计信息,并将新的含有RDB格式个AOF格式的AOF文件替换旧的AOF文件。也就是新的AOF文件前半段是RDB格式(占用空间更小,但是可读性较差)的全量数据后半段是AOF格式的增量数据。优点是混合持久化结合了RDB持久化和AOF持久化的特点,由于绝大部分都是RDB格式,加载数据快,同时结合AOF,增量数据以AOF方式保存了,数据更少地丢失。
持久化方案选择(优化建议):
-
如果redis仅仅是用来做为缓存服务器的话,我们可以不使用任何的持久化(建议redis启动时进行全量数据同步或定时全量同步);
-
官方建议两种持久化的方式都开启,同时开启情况下,redis优先使用AOF持久化机制;
-
在主从节点中,RDB作为我们的备份数据,只在salve(从节点)上启动,同步时间可以设置的长一点,只留(save 900 1)这条规则就可以了;
-
开启AOF的情况下,主从同步是时候必然会带来IO的性能影响,此时我们可以调大auto-aof-rewrite-min-size的值,比如5GB,来减少IO的频率;
-
不开启AOF的情况下,可以节省IO的性能影响,主从节点通过RDB持久化同步,但如果主从都挂掉,影响较大。
备注:
1、redis中的save指令,主进程持久化数据;bgsave指令,创建一个子进程持久化数据。
2、aof文件重写机制(瘦身),如下图所示,第一次重写文件大小达到指定配置时重写。第二次重写,文件大小达到配置比例时触发。重写需要fork一个子进程,开销很大(相当于运行2个redis),故生产环境中需要配置的大一些(5G以上),避免频繁进行重写。
3、RDB持久化模式会fork一个子进程进行,AOF模式不会,但是AOF的重写机制会fork一个子进程。
redis内存淘汰策略:
1)LRU算法作为内存管理的一种有效算法,其含义是在内存有限的情况下,当内存容量不足时,为了保证程序的运行,这时就不得不淘汰内存中的一些对象,释放这些对象占用的空间。
2)LRU (英文:Least Recently Used), 意为最近最少使用,如果一块数据最近被访问,那么它将来被访问的几率也很高,根据数据的历史访问来淘汰长时间未使用的数据。
3)在操作系统中LRU算法淘汰的不是内存中的对象,而是页,当内存中数据不足时,通过LRU算法,选择一页(一般是4KB)将其交换到虚拟内存区(Swap区)。