Redis 学习(配置文件和常用命令注释)
最近公司需要上线一个新的业务需要使用到redis,我也趁这个机会学习了下redis,了解了redis的安装、配置、常用命令、以及怎么监控redis;我学习redis主要的是参考两本书《Redis入门指南》《Redis实战(红丸出品)》,这两本书从最基础的开始讲redis。在这里我总结了下我在学习过程中的一些信息,对配置文件和常用命令进行了详细的注释,以备以后使用。
Redis 学习(Redis Info详细注释):
Redis 学习(Zabbix 监控Redis):
===========================================================================================
redis配置文件详细注释(redis.conf)
daemonize yes
默认redis不在后台运行,如果需要在后台运行,请将该值改为yespidfile pidfilepath pid文件路径,默认是/var/run/reids.pid;如果运行多个实例,则需要指定不同端口和不同的pid文件bind 指定reids只接受来自该ip地址的请求,默认接受所有请求,生产环节最好设置该项port 6379 redis监听端口,默认为6379;运行多个实例时配置不同的端口timeout 0 客户端连接超时时间,单位为秒,默认为0;loglevel log等级分为4级,debug、verbose、notice、warning;生产环境一般开始noticelogfile 配置log文件地址,默认使用标准输出,即打印在命令行终端databases 16 设置数据库个数,可以使用select <dbid>命令来切换数据库,默认使用数据库为0;默认数据库个数为16save 设置redis进行数据库镜像的频率 save 900 1 save 300 10 save 10000 1stop-writes-on-bgsave-error yes 当持久化出现错误时是否还提供写功能rdbcompression 在进行镜像备份时,是否进行压缩,一般设置为yesdbfilename 镜像备份文件的文件名,默认为dump.rdbdir 数据库镜像备份文件放置路径;给文件名分开是因为镜像备份时先写一个临时文件,等备份完成后用临时文件替换上面指定的文件slaveof masterip masterport 设置该数据为其他数据库的从库slave-serve-stale-data yes 当slave和master断开连接后,或者正当数据正在复制传输的时候是否接受客户端的请求slave-read-only yes 从服务器是否只读slave-priority 10 当有多个从库的时候,当master宕机的时候,Redis Sentinel会将权重值最小的设置master,0表示永远不提升masterauth 指定主数据库连接需要的密码(主数据开启了密码验证)requirepass 设置客户端连接的密码maxclients 限制同时连接的客户端数据,当超过这个值时,redis不在接受其他连接请求并返回error信息maxmemory 设置redis能够使用的最大内存,内存满了之后,redis将先尝试提出设置过expire信息的keymaxmemory-policy volatile-lru 当redis最大使用内存后,内存清理策略,默认为volatile-lrumaxmemory-samples 3 reids内存清理策略随机样本数,默认为3appendonly yes 开始redis的AOF持久化appendfsync 设置对appendon.aof 文件进行同步的频率 always 每次有写操作都进行同步,安全但最慢 everysec 每秒一次,相对安全又兼顾了性能 no 根据系统设置,默认每30秒写一次lua-time-limit 5000 一个lua脚本执行的最长时间,0或负数表示无限制vm-enabled 是否开启虚拟内存支持vm-swap-file 设置虚拟内存的交换文件路径vm-max-memory 设置开启虚拟内存后redis将使用的最大物理内存,默认为0即不限制,生产环节最好根据实际情况设置该值vm-page-size 设置虚拟内存的页大小,如果value值比较大就需要设置较大一点vm-pages 设置交换文件总得page数量,page table信息会放在物理内存中,总得虚拟内存大小 = vm-page-size *vm-pagesmv-max-threads 设置VM IO同时使用的线程数据,如果vlaue值比较大将该值设稍大一点,还是能够提升性能glueoutputbuf 把小的输出缓存放在一起;常设置为yeshash-max-zipmap-entries 设置hash数据结构指定元素个数且最大元素的临界点activerehashing 设置为yes,以便尽快的释放内存注:这并不是所有的配置项,这是我根据我了解的进行了个人理解的注释,仅供参考
===========================================================================================
常用类型命令注释之string类型及操作 set 设置key对应的值为string类型的value setnx 设置key对应的值为string类型的value,如果key存在则不进行操作,返回0 setex 设置key对应的值为string类型的value,并对此键值设置对应的有效期 setrange 设置key的value值的子字符串(个人理解为键值的替换) setrange name 8 gmail.com 将name键的键值从下标为8的字符开始替换为gmail.commset 一次设置多个key的值,返回ok表示所有值都设置成功,返回0表示所有值都设置失败msetnx 一次设置多个key的值,ok则所有值都设置成功,不会覆盖已经存在的keyget 获取key对应的string值,key不存在则返回nilgetset 设置key的值,并返回key的旧值getrange 获取指定key的value值的字符串 getrange name 0 6 获取name的键值下标从0到6部分的值mget 一次获取多个key的值,key不存在则对应返回nilincr 对key的值做加加操作,并返回新的值;如果value不是int类型则会报错,如果key不存在,则该key的键值为1incrby 可以指定增加的值,如果key不存在,则默认认为key的value为0 incrby age 5 将age的value值一次性增加5decr 对key的值做减减操作,key不存在则设置key的值为-1decrby 可以指定减的值,跟incrby相反append 给指定key的字符串值最佳value,返回新字符串值的长度strlen 取指定key的value值的长度===========================================================================================常用类型命令注释之hashes类型及操作
hset 设置hash 字典指定值,key不存在则创建 hset myhash field hellohsetnx 设置hash field为指定的值。如果key不存在则先创建,如果key存在则返回0hmset 同时设置多个field hmset myhash field1 hello field2 worldhget 获取自定hash field,字段不存在返回nilhmget 获取多个的hash field hmget myhash field1 field2hincrby 给指定hash field加上指定的值hexists 测试field是否存在hlen 返回指定hash的field数量 hlen myhashhdel 删除指定field,返回的是删除后的field数量hkeys 返回所有hash的fieldhvals 返回hash所有的valuehgetall 获取某个hash中全部的field以及value===========================================================================================常用类型命令注释之list类型及操作
lpush 在key对应list的头部添加字符串元素(从列表左边插入)rpush 在key对应list的尾部添加字符串元素(从列表右边插入)linsert 在key对应list的特定位置之前或者之后添加字符串元素 linsert mylist before world there before 在特定位置之前插入 after 在特定位置之后插入lset 设置list中制定下标元素值 lset mylist 2 carlrem 从key对用list中删除count个和value相同的元素 lrem mylist 2 hello 从mylist列表中删除2个与hello相同的元素 count > 0 从头到尾删除 count < 0 从尾到头删除 count = 0 删除全部ltrim 保留制定key的值范围内的数据 ltrim mylist 0 3lpop 从list头部删除元素,并返回删除的元素rpop 从list尾部删除元素,并返回删除的元素rpoplpush 从第一个list尾部一处元素并添加到第二个list的头部,最后返回被移植的元素,如果第一个list不存在或空返回nil rpoplpush mylist1 mylist2lindex 返回list中index位置的元素 lindex mylist 1 返回mylist中下标为1的元素(从0计数)llen 返回list的长度===========================================================================================常用类型命令注释之sets类型及操作
sadd 向set中添加元素srem 删除set中的元素spop 随机删除一个set中的元素并返回删除元素sdiff 返回第二个set和第一个set的差集 sidff set1 set2 返回set2与set1的差集(也就是在set2中但不在set1中的元素)sidffstore 返回第二个set与第一个set的差集,并将结果保存为另一个set sdiffstore set1 set2 set3 返回set2与set1的差集,并将结果保存到set3中sinter 返回给定key的交集 sinter set1 set2sinterstore 返回给定key的交集,并将结果存为另一个key sinterstore set1 set2 set3sunion 返回给定key的并集sunionstore 返回给定key的并集,并将结果存为另一个keysmove 从第一个set中移除元素并添加到第二个set中 smove set1 set2 car 从set1中移除car,并将car添加到set2中scard 返回set的元素个数sismember 判断元素是否在set中,返回0表示不存在,1表示存在 sismember set two 判断two是否在set中srandmember 随机返回一个set中的元素,但不删除===========================================================================================常用类型命令注释之sorted set类型及操作
zadd 向sorted set中添加元素,score用于排序,如果元素存在则更小score zadd myzset 1 onezrem 删除zset中的元素 zrem myzset twozincrby 想zset中添加元素,如果元素存在则将该元素的score增加Increment,否则想zset中添加该元素,score值为incrementzrank 返回zset中元素排名(按照score从小到大排序)即下标zrevrank 返回zset中元素排名(按照score从大到小排序)即下标zrevrange 返回zset中(按score从大到小排序)从start到end的所有元素 arevrange myzset 0-3 withscoreszrangebuscore 返回zset中score在给定区间的元素 zrange myzset 0 5 withscoreszcount 返回集合中score在给定区间的数量 zrange myzset 2 3zcard 返回zset中元素个数zscore 返回zset中元素对应的scorezremrangebyrank 删除集合排名在给定区间的元素 zremrangebyrank myzset 3 4zremrangebyscore 删除zset中score在给定区间的元素 zremrangebyscore myzset 1 2===========================================================================================reids常用命令
keys * 返回所有key keys mylist* 返回所有含有mylist的keyexists 确认一个key是否存在del 删除一个keyexpire 设置一个key的过期时间move 将当期数据库中的key移动到其他数据库 move name 1 将名为name的key移动到数据库1persist 删除kye的过期时间randomkey 随机返回一个keyrename 重命名keytype 返回值的类型===========================================================================================服务器相关命令
ping 测试连接是否存活,返回PONG表示存活,否则返回connecton refusedecho 在命令行打印内容select 选择数据库,数据库编号0-15quit 退出连接dbsize 返回当前数据中key的数目info 获取服务器的信息和统计monitor 实时转储收到的请求config get 获取服务器配置信息flushdb 删除当前数据中的所有keyflushall 删除所有数据库中的所有key-------------------------------------------------------------------------------------------
持久化默认RDB方式在配置文件中通过制定save 来进行RDB持久化,由两个参数构成:实践和改动的键的个数 save 900 1 save 300 10 save 60 1000AOF 快照通过appendonly yes 开启AOF方式持久化 开启AOF持久化后每执行一条命令后redis都将该命令写入硬盘,保存文件和RDB文件路径一样通过dir设置,文件名默认appendonly.aof,通过appendfilename更改 appendfilename appendonly.aof 设置AOF重写,redis根据规则自动删除冗余的记录 auto-aof-rewrite-percentage 100 设置当前AOF文件大小超过上一次重写时的AOF文件大小的百分之多少会再次进行重写 auto-aof-rewrite-mim-size 64mb 限制允许重写的最小AOF文件大小 AOF持久化在redis每次执行命令后并没有真正的将数据写入的硬盘,而是写入到了操作系统的硬盘缓存中,系统默认30秒会将硬盘缓存中的数据写入到本地硬盘 设置redis在写入AOF文件后主动将硬盘缓存内容同步到本地硬盘 appendfsync always 每次执行写入后都同步一次,这种最安全但也最慢 appendfsync everysec 默认设置,每秒同步一次,兼顾性能又保证安全 appendfsync no 不主动同步,由系统每30秒同步一次-------------------------------------------------------------------------------------------redis主从复制一个主数据可以有多个从数据库,一个从数据库只能有一个主数据库设置主从(在从库机器上操作) 在配置文件中加入slaveof 主库ip 端口即可 slaveof 192.168.5.128 6379 或者从命令行启动 redis-server --slaveof 192.168.5.128 6379 在redis命令行执行 SLAVEOF 主库ip 端口 reis > SLAVEOF 192.168.5.128 6379默认情况下从库是只读的 slave-read-only no 设置从库可写 上面数据不会同步到其他数据库 主库上该修改会覆盖从库上的数据如果该机器已经是其他主数据库的从库,slaveof命令会停止和原数据库的同步改为和新数据库同步可以使用slaveof no one 来使当前数据库停止接收其他数据库的同步而转为主数据库可以配置slave-server-stale-data no来使从库在同步完成前对所用命令(info、slaveof除外)都回复错误“SYNC with master in progress”图结构复制从数据不仅可以接收主数据库的同步数据,自己还可以同时作为主数据库存在,从数据库持久化在从数据库中启用持久化,同时主数据库禁用持久化; 当从库出现问题后,主数据库会自动将数据同步过来; 当主库出现问题后,需要在从库中使用slaveof no one 将从库提升为主库,并将原先的主库设置为从库,可以将数据同步回去-------------------------------------------------------------------------------------------安全(必须保证配置文件的安全性)可信的环境redis 应该运行在可信的安全环境下,默认reids会接收来自任何地址发送来的请求,可以通过bind参数绑定地址bind 192.168.5.128然后重启redis数据库密码我们可以通过配置给redis设置密码 requirepass reids@!$REDIS这样每次客户端连接的时候都需要发送密码,否则客户端会拒绝执行命令 发送密码使用AUTH AUTH reids@!$REDIS~~提示:如果redis复制时主库设置了密码,需要在从库设置主库密码,以使从数据连接主库时自动使用AUTH命令认证 masterauth reids@!$REDIS (从库的配置文件中设置)reids 支持在配置文件中将命令重命名,以保证只有自己的应用可以使用该命令 rename-command FLUSHALL getall 将FLUSHALL命令重命名为getall rename-command FLUSHALL "" 禁用FLUSHALL命令