1.redis基本介绍
1.1 redis介绍
- Redis属于非关系型数据库和Memcached类似,redis也是一个key-value型存储系统。
- 但redis支持的存储value类型相对更多,包括string(字符串)、list(列表)、set(集合)和zset(有序集合)等。
- 这些数据类型都支持push/pop、add/remove及取交集、并集和差集及更丰富的操作,而且这些操作都是原子性的。为了保证效率,redis的数据都是缓存在内存中。
区别是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在基础上实现了master-slave(主从)同步。
1.2 Redis和Memecache的不同
- 存储方式:memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小, Redis有部份存在硬盘上,这样能保证数据的持久性,支持数据的持久化(笔者注:有RDB快照和AOF日志两种持久化方式,在实际应用的时候,要特别注意配置文件快照参数,要不就很有可能服务器频繁满载做dump)
- 数据支持类型:redis在数据支持上要比memecache多的多。
- 使用底层模型不同:新版本的redis直接自己构建了VM 机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
- 运行环境不同:redis目前官方只支持Linux 上去行,从而省去了对于其它系统的支持,这样的话可以更好的把精力用于本系统环境上的优化,虽然后来微软有一个小组为其写了补丁。但是没有放到主干上
总结:对于两者的选择还是要看具体的应用场景,如果需要缓存的数据只是key-value这样简单的结构时,我在项目里还是采用memcache,它也足够的稳定可靠。如果涉及到存储,排序等一系列复杂的操作时,毫无疑问选择redis。
1.3 redis应用场景
redis最佳使用场景是全部数据in-memory redis更多场景最为memcached的替代品来使用 需要除key/value之外的更多数据类型支持时,使用redis更合适 当存储的数据不能被剔除时,使用redis更合适
1.4 Redis支持的键值类型
- String 字符串类型
- Hash散列类型
- List列表类型
- Set集合类型
Zset有序集合类型
2. 安装redis
[[email protected] ~]# cd /usr/local/src/ [[email protected] src]# wget -q http://download.redis.io/releases/redis-3.2.8.tar.gz #-q隐藏 [[email protected] src]# tar xf redis-3.2.8.tar.gz [[email protected] src]# cd redis-3.2.8/ [[email protected] src]# make [[email protected] src]# make PREFIX=/usr/local/redis01 install [[email protected] redis01]# tree /usr/local/redis01/ /usr/local/redis01/ └── bin ├── redis-benchmark #redis性能读写测试工具 ├── redis-check-aof #对更新日志appenonly.aof检查,类似于mysql binlog ├── redis-check-rdb #用于本地数据库rdb文件的检查 ├── redis-cli #redis命令行客户端操作工具 ├── redis-sentinel -> redis-server └── redis-server #redis服务器daemon启动程序 1 directory, 6 files [[email protected] redis01]# echo "export PATH=/usr/local/redis01/bin:$PATH" >>/etc/profile [[email protected] redis01]# source /etc/profile [[email protected] redis01]# redis-server & #启动 [[email protected] redis01]# redis-cli #进入到客户端 127.0.0.1:6379> keys * (empty list or set) 127.0.0.1:6379> exit [[email protected] redis01]# redis-cli shutdown #关闭
2.1 指定配置文件启动
[[email protected] redis01]# pwd /usr/local/redis01 [[email protected] redis01]# mkdir -p conf [[email protected] redis01]# cp /usr/local/src/redis-3.2.8/redis.conf conf/ [[email protected] redis01]# redis-server /usr/local/redis01/conf/redis.conf &
解决启动报warning信息:
可选值:0、1、2
0 内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1 内核允许分配所有的物理内存,而不管当前的内存状态如何。
2 内核允许分配超过所有物理内存和交换空间总和的内存
三种设置方法:
编辑/etc/sysctl.conf ,改vm.overcommit_memory=1,然后sysctl -p 生效
sysctl vm.overcommit_memory=1
echo 1 > /proc/sys/vm/overcommit_memory
2.2 redis配置文件介绍
daemonize yes #是否以后台进程运行 pidfile /var/run/redis/redis-server.pid #pid文件位置 port 6379#监听端口 bind 127.0.0.1 #绑定地址,如外网需要连接,设置0.0.0.0 空格分隔 timeout 300 #连接超时时间,单位秒 loglevel notice #日志级别,分别有: # debug :适用于开发和测试 # verbose :更详细信息 # notice :适用于生产环境 # warning :只记录警告或错误信息 logfile /var/log/redis/redis-server.log #日志文件位置 syslog-enabled no #是否将日志输出到系统日志 databases 16#设置数据库数量,默认数据库为0 ############### 快照方式 ############### save 900 1 #在900s(15m)之后,至少有1个key发生变化,则快照 save 300 10 #在300s(5m)之后,至少有10个key发生变化,则快照 save 60 10000 #在60s(1m)之后,至少有1000个key发生变化,则快照 rdbcompression yes #dump时是否压缩数据 dir /var/lib/redis #数据库(dump.rdb)文件存放目录 ############### 主从复制 ############### slaveof <masterip> <masterport> #主从复制使用,用于本机redis作为slave去连接主redis masterauth <master-password> #当master设置密码认证,slave用此选项指定master认证密码 slave-serve-stale-data yes #当slave与master之间的连接断开或slave正在与master进行数据同步时,如果有slave请求,当设置为yes时,slave仍然响应请求,此时可能有问题,如果设置no时,slave会返回"SYNC with master in progress"错误信息。但INFO和SLAVEOF命令除外。 ############### 安全 ############### requirepass foobared #配置redis连接认证密码 ############### 限制 ############### maxclients 128#设置最大连接数,0为不限制 maxmemory <bytes>#内存清理策略,如果达到此值,将采取以下动作: # volatile-lru :默认策略,只对设置过期时间的key进行LRU算法删除 # allkeys-lru :删除不经常使用的key # volatile-random :随机删除即将过期的key # allkeys-random :随机删除一个key # volatile-ttl :删除即将过期的key # noeviction :不过期,写操作返回报错 maxmemory-policy volatile-lru#如果达到maxmemory值,采用此策略 maxmemory-samples 3 #默认随机选择3个key,从中淘汰最不经常用的 ############### 附加模式 ############### appendonly no #AOF持久化,是否记录更新操作日志,默认redis是异步(快照)把数据写入本地磁盘 appendfilename appendonly.aof #指定更新日志文件名 # AOF持久化三种同步策略: # appendfsync always #每次有数据发生变化时都会写入appendonly.aof # appendfsync everysec #默认方式,每秒同步一次到appendonly.aof # appendfsync no #不同步,数据不会持久化 no-appendfsync-on-rewrite no #当AOF日志文件即将增长到指定百分比时,redis通过调用BGREWRITEAOF是否自动重写AOF日志文件。 ############### 虚拟内存 ############### vm-enabled no #是否启用虚拟内存机制,虚拟内存机将数据分页存放,把很少访问的页放到swap上,内存占用多,最好关闭虚拟内存 vm-swap-file /var/lib/redis/redis.swap #虚拟内存文件位置 vm-max-memory 0 #redis使用的最大内存上限,保护redis不会因过多使用物理内存影响性能 vm-page-size 32 #每个页面的大小为32字节 vm-pages 134217728 #设置swap文件中页面数量 vm-max-threads 4 #访问swap文件的线程数 ############### 高级配置 ############### hash-max-zipmap-entries 512 #哈希表中元素(条目)总个数不超过设定数量时,采用线性紧凑格式存储来节省空间 hash-max-zipmap-value 64 #哈希表中每个value的长度不超过多少字节时,采用线性紧凑格式存储来节省空间 list-max-ziplist-entries 512 #list数据类型多少节点以下会采用去指针的紧凑存储格式 list-max-ziplist-value 64 #list数据类型节点值大小小于多少字节会采用紧凑存储格式 set-max-intset-entries 512 #set数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储 activerehashing yes #是否激活重置哈希