Redis(一)----安装及基本使用
一、基本认识
Redis(REmote DIctionary Server)是一种非关系型数据库,像类似的Nosql还有MongoDB,Hbase等;它由C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value类型的数据库,它还支持包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型);并提供多种语言的API。和Memcached类似,这些数据类型都支持push/pop、add/remove及取交集并集和差集及其他操作,而且这些操作都是原子性的。此外,redis支持不同方式的排序。数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步,redis在3.0版本推出集群模式。
Redis的优势:
- 数据结构存储类型更多(字符串、集合、有序集合、哈希类型等共5种)
- 数据的操作都是在内存中完成
- 支持主从复制模式,提供高可用的主从复制模式(哨兵)
- 支持事务、发布/订阅、消息队列等功能
- 支持数据持久化(AOF、RDB)
- 分布式集群
- 单线程服务,采用epoll模型进行请求响应
它和memcache、MongoDB的比较:
参考我另外一篇:https://www.cnblogs.com/Utopia-Clint/p/10809535.html
二、安装
linux环境下:
第一步:创建目录,安装所依赖的插件
yum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make gcc-c++ libstdc++-devel tcl
第二步:上传资源包解压
mkdir -p /usr/local/src/redis cd /usr/local/src/redis wget http://download.redis.io/releases/redis-4.0.8.tar.gz 或者rz上传 或者xftp上传 tar -xvf redis-4.0.8.tar.gz
第三步:进入目录,安装
cd redis-2.8.17
make
make install
第四步:修改配置文件
cp redis.conf /etc/ vi /etc/redis.conf # 修改如下,默认为no daemonize yes # 是否后台启动
第五步:启动redis
redis-server /etc/redis.conf
查看redis是否启动:
ps -ef | grep redis
第六步:测试
redis-cli
安装完成!
附加:
开放redis端口号:6379 让其支持远程访问:
/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT /sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT /etc/rc.d/init.d/iptables save 重启 iptables : service iptables restart
查看密码(默认无密码)
config get requirepass
设置密码
config set requirepass 123456
再次查看需要认证
连接客户端时,指定密码,此时就不需要认证
三、配置详情
二进制文件说明:
redis安装完成后会有以下可执行文件(window下是exe文件)生成,下面是各个文件的作用。
redis-server # Redis服务器和Sentinel服务器,启动时候可使用--sentinel指定为哨兵 redis-cli # Redis命令行客户端 redis-benchmark # Redis性能测试工具 redis-check-aof # AOF文件修复工具 redis-check-dump # RDB文件检测工具 redis-sentinel # Sentinel服务器
配置参数的说明:
redis所有的配置参数都可以通过客户端通过“CONFIG GET 参数名” 获取,参数名支持通配符,如*代表所有。所得结果并按照顺序分组,第一个返回结果是参数名,第二个结果是参数对应的值。
配置参数为dbfilename,值为dump.rdb
除了查看配置还可以使用CONFIG SET修改配置,写入配置文件使用CONFIG REWRITE,使用时是需要注意某些关于服务配置参数慎重修改;
以下是部分参数详细解释:
logfile # 日志文件位置及文件名称 bind 0.0.0.0 # 监听地址,可以有多个如bind 0.0.0.0 127.0.0.1 daemonize yes # yes启动守护进程运行,即后台运行,no表示不启用 pidfile /var/run/redis.pid # 当redis在后台运行的时候,Redis默认pid文件在在/var/run/redis.pid,也可以配置到其他地方。 # 当运行多个redis服务时,需要指定不同的pid文件和端口 port 6379 # 指定redis运行的端口,默认是6379 unixsocket # sock文件位置 unixsocketperm # sock文件权限 timeout 0 # 设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接, 0是关闭此设置 loglevel debug # 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose logfile "" # 日志文件配置,默认值为stdout,标准输出,若后台模式会输出到/dev/null syslog-enabled # 是否以syslog方式记录日志,yes开启no禁用,与该配置相关配置syslog-ident 和syslog-facility local0 分别是指明syslog的ident和facility databases 16 # 配置可用的数据库个数,默认值为16,默认数据库为0,数据库范围在0-(database-1)之间 always-show-logo yes # 是否配置日志显示redis徽标,yes显示no不显示
################################ 快照相关配置 #################################
# 配置快照(rdb)促发规则,格式:save <seconds> <changes> save 500 1 # 500秒内至少有1个key被改变则做一次快照 save 100 10 # 100秒内至少有10个key被改变则做一次快照 save 60 10000 # 60秒内至少有10000个key被改变则做一次快照 dbfilename dump.rdb # rdb持久化存储数据库文件名,默认为dump.rdb stop-write-on-bgsave-error yes # yes代表当使用bgsave命令持久化出错时候停止写RDB快照文件,no则代表继续写 rdbchecksum yes # 开启rdb文件校验 dir "/etc" # 数据文件存放目录,rdb快照文件和aof文件都会存放至该目录
################################ 复制相关配置 #################################
slaveof <masterip> <masterport> # 设置该数据库为其他数据库的从数据库,设置当本机为slave服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步 masterauth <master-password> # 主从复制中,设置连接master服务器的密码(前提master启用了认证) slave-serve-stale-data yes # 当从库同主机失去连接或者复制正在进行,从机库有两种运行方式: # 1) 如果slave-serve-stale-data设置为yes(默认设置),从库会继续相应客户端的请求 # 2) 如果slave-serve-stale-data是指为no,除了INFO和SLAVOF命令之外的任何请求都会返回一个错误"SYNC with master in progress" repl-ping-slave-period 10 # 从库会按照一个时间间隔向主库发送PING命令来判断主服务器是否在线,默认是10秒 repl-timeout 60 # 设置主库批量数据传输时间或者ping回复时间间隔超时时间,默认值是60秒 # 一定要确保repl-timeout大于repl-ping-slave-period repl-backlog-size 1mb # 设置复制积压大小,只有当至少有一个从库连入才会释放。 slave-priority 100 # 当主库发生宕机时候,哨兵会选择优先级最高的一个称为主库,从库优先级配置默认100,数值越小优先级越高 min-slaves-to-write 3 min-slaves-max-lag 10 #设置某个时间断内,如果从库数量小于该某个值则不允许主机进行写操作,以上参数表示10秒内如果主库的从节点小于3个,则主库不接受写请求,min-slaves-to-write 0代表关闭此功能。
################################ 安全相关配置 #################################
requirepass # 客户端连接认证的密码,默认为空,即不需要密码,若配置则命令行使用AUTH进行认证 maxclients 10000 # 设置同一时间最大客户端连接数,默认10000,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数, # 如果设置 maxclients 0,表示不作限制。 # 当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息 maxmemory 4gb # 设置最大使用的内存大小 maxmemory-policy noeviction # 设置达到最大内存采取的策略: # volatile-lru -> 利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used ) # allkeys-lru -> 利用LRU算法移除任何key # volatile-random -> 移除设置过过期时间的随机key # allkeys->random -> remove a random key, any key # volatile-ttl -> 移除即将过期的key(minor TTL) # 默认noeviction代表不删除任何key,只在写操作时候返回错误。 maxmemory-samples 5 # LRU,LFU等算法样本设置,默认5个key
################################ AOF相关配置 #################################
appendonly no # 设置AOF持久化,yes开启,no禁用,开启后redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态。 # 但是这样会造成appendonly.aof文件过大,所以redis还支持了BGREWRITEAOF指令,对appendonly.aof 进行重写。 appendfilename "appendonly.aof" # 设置AOF文件名 appendfsync everysec # AOF文件写策略,Redis支持三种同步AOF文件的策略: # no: 不进行同步,交给操作系统去执行 ,速度较快 # always: always表示每次有写操作都调用fsync方法强制内核将该写操作写入到文件,速度会慢, 但是安全,因为每次写操作都在AOF文件中. # everysec: 表示对写操作进行累积,每秒同步一次,折中方案. # 默认是"everysec",按照速度和安全折中这是最好的。 no-appendfsync-on-rewrite no # AOF策略设置为always或者everysec时,后台处理进程(后台保存或者AOF日志重写)会执行大量的I/O操作 # 在某些Linux配置中会阻止过长的fsync()请求。注意现在没有任何修复,即使fsync在另外一个线程进行处理,为了减缓这个问题,可以设置下面这个参数no-appendfsync-on-rewrite auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb # 当AOF文件增长到一定大小的时候Redis能够调用BGREWRITEAOF对日志文件进行重写,它是这样工作的:Redis会记住上次进行些日志后文件的大小(如果从开机以来还没进行过重写,那日子大小在开机的时候确定)。 # 基础大小会同现在的大小进行比较。如果现在的大小比基础大小大制定的百分比,重写功能将启动 # 同时需要指定一个最小大小用于AOF重写,这个用于阻止即使文件很小但是增长幅度很大也去重写AOF文件的情况 # 设置 percentage 为0就关闭这个特性 # auto-aof-rewrite-percentage 代表AOF文件每次重写文件大小(以百分数代表),100表示百分之百,即当文件增加了1倍(100%),则开始重写AOF文件 # auto-aof-rewrite-min-size 设置最小重写文件大小,避免文件小而执行太多次的重写 aof-load-truncated yes # 当redis突然运行崩溃时,会出现aof文件被截断的情况,Redis可以在发生这种情况时退出并加载错误,以下选项控制此行为。 # 如果aof-load-truncated设置为yes,则加载截断的AOF文件,Redis服务器启动发出日志以通知用户该事件。 # 否则,如果该选项设置为no,则服务器将中止并显示错误并停止启动。当该选项设置为no时,用户需要在重启之前使用“redis-check-aof”实用程序修复AOF文件在进行重启
############################### 慢查询相关配置 #################################
slowlog-log-slower-than 10000 # Redis Slow Log 记录超过特定执行时间的命令。执行时间不包括I/O计算比如连接客户端,返回结果等,只是命令执行时间,可以通过两个参数设置slow log:
一个是告诉Redis执行超过多少时间被记录的参数slowlog-log-slower-than(微秒,因此1000000代表一分钟 另一个是slow log 的长度。当一个新命令被记录的时候最早的命令将被从队列中移除
slowlog-max-len 128 # 慢查询命令记录队列长度设置,该队列占用内存,可以使用SLOWLOG RESET清空队列
四、数据类型以及相关操作
相关说明
通常使用redis常用的5中数据类型:string、list、hash、set、sorted_set,以下将对其类型的常用操作做说明
Redis所有的命令提供了帮助,可以使用help +命令名称查看其使用方法,帮助信息中不仅有命令用法,还有命令始于版本信息,分组等。
Redis还将所有命令都进行了分组,同时使用help @组名 进行查看每个组中所有命令,以下是所有分组信息。
generic # 一般命令组,对大多数类型适用 string # 字符串类型命令组,使用所有字符串类型 list # 列表类型命令组 set # 集合类型命令组 sorted_set # 有序集合命令组 hash # hash操作命令组 pubsub # 发布命令组 transactions # 事务操作命令组 connection # 连接相关命令组 server # 服务器相关命令组 scripting # lua 脚本命令组 cluster # 集群相关命令组
例如:
Key操作
KEY * # 查看所有key DEL key # 删除某个key KEYS pattern # 查看符合正则的所有key EXISTS key [key ...] # 判断某个key是否存在,可支持多个,返回存在的个数 EXPIRE key seconds # 刷新某个key过期时间 MOVE key db # 移动key到某个数据库
string操作:(redis中的整型也当作字符串处理)
SET key value [EX seconds] [PX milliseconds] [NX|XX] # 设置key为指定的字符串值。 # 参数: # EX seconds – 设置键key的过期时间,单位时秒 # PX milliseconds – 设置键key的过期时间,单位时毫秒 # NX – 只有键key不存在的时候才会设置key的值 # XX – 只有键key存在的时候才会设置key的值 APPEND key value # 如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作,这种情况 APPEND 将类似于 SET 操作。 GET key # 获取key值,不存在则返回nil GETRANGE key start end # 获取指定key值的索引开始位置和结束位置所对应的值,索引从0开始 GETSET key value # 设置新的key值,并获取设置之前的值,如果key不存在则设置,并返回nil MGET key [key ...] # 批量获取key的值 MSET key value [key value ...] # 批量设置key的值 DECR key # 数字类型的key自减操作,key类型不是数字则报错 INCR key # 数字类型key 自加操作,与DECR相反 DECRBY key decrement # 数字类型key指定减少数值 INCRBY key increment # 数字类型key指定增加数值,与DECRBY相反 STRLEN key # 获取key长度
list操作
列表中的元素索引从0开始,倒数的元素可以用“-”+倒数位置表示,如-2,代表倒数第二个元素,-1则代表最后一个元素。Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边。一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)
LPUSH key value [value ...] # 从列表左边放入一个或者多个元素 LPUSHX key value # 当列表存在时,从左边放入一个元素 RPUSH key value [value ...] # 从列表右边放入一个或者多个元素 RPUSHX key value # 当列表存在时,从右边放入一个元素 LSET key index value # 根据索引设置列表中元素的值,当list不存在是报错 LINDEX key index # 根据列表索引获取元素值,索引从0开始 LINSERT key BEFORE|AFTER pivot value # 在列表中,基于某个基准点插入值,pivot代表基准点 LLEN key # 获取列表长度 LRANGE key start stop # 根据索引获取列表中的元素,列表索引最后一个可以使用-1 LREM key count value # 从存于 key 的列表里移除前 count 次出现的值为 value 的元素 # count > 0: 从头往尾移除值为 value 的元素 # count < 0: 从尾往头移除值为 value 的元素 # count = 0: 移除所有值为 value 的元素 LPOP key # 从列表左边删除一个元素 RPOP key # 从列表右边删除一个元素 RPOPLPUSH source destination # 删除source列表中的删除最后一个元素将其追加到destination列表 LTRIM key start stop # 根据索引start和stop保留列表元素
hash操作
hash操作所有命令都以H开头。Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
HDEL key field [field ...] # 删除hash表中一个或多个字段 HEXISTS key field # 判断hash表中字段是否存在 HGET key field # 获取hash表中字段的值 HGETALL key # 获取hash表中所有字段 HSET key field value # 设置hash表中字段的值 HSETNX key field value # 只有当字段不存在时候才设置hash表中字段值, HLEN key # 获取hash表中字段个数 HVALS key # 获取hash表中所有字段的值 HKEYS key # 获取hash表中所有的字段 HSTRLEN key field # 获取hash表中指定字段的值的长度 HMSET key field value [field value ...] # 批量设置hash表中字段的值 HMGET key field [field ...] # 批量获取hash表中字段的值
集合set操作:
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据;Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1);集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
SADD key member [member ...] # 添加一个或多个元素到集合中 SREM key member [member ...] # 删除一个或多个集合中的元素 SCARD key # 获取集合中元素数量 SMEMBERS key # 返回集合中所有的元素 SINTER key [key ...] # 获取两个或两个以上集合的交集 SUNION key [key ...] # 获取两个或两个以上集合的并集 SDIFF key [key ...] # 获取两个或者两个以上集合的差集 SISMEMBER key member # 判断元素是否是在指定集合中 SMOVE source destination member # 移动一个集合中的元素到另一个集合 SPOP key [count] # 移除count个集合中元素,count可选参数,默认为1,即移除一个
有序集合操作
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员;不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序;有序集合的成员是唯一的,但分数(score)却可以重复;集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
ZADD key [NX|XX] [CH] [INCR] score member [score member ...] # 向一个有序集合添加成员(元素) # 参数: # XX: 仅仅更新存在的成员,不添加新成员。 # NX: 不更新存在的成员。只添加新成员。 # CH: 修改返回值为发生变化的成员总数,原始是返回新添加成员的总数 (CH 是 changed 的意思)。更改的元素是新添加的成员,已经存在的成员更新分数。 所以在命令中指定的成员有相同的分数将不被计算在内。注:在通常情况下,ZADD返回值只计算新添加成员的数量。 # INCR: 当ZADD指定这个选项时,成员的操作就等同ZINCRBY命令,对成员的分数进行递增操作。 ZCARD key # 获取有序集合中元素个数 ZCOUNT key min max # 指定分数范围的元素个数 ZINCRBY key increment member # 为有序集的元素的score值加上增加指定的increment ZRANGE key start stop [WITHSCORES] # 根据有序集合中分数区间获取集合中的元素 ZRANGE key start stop [WITHSCORES] # 获取有序集合中元素的排名 ZREM key member [member ...] # 删除有序集合中一个或多个元素 ZSCORE key member # 设置元素在集合中的分数