Ubuntu 安装 redis
root用户下:
apt-get install redis-server // 安装
redis-server // 使用默认配置项启动redis服务
redis-cli shutdown // 关闭服务
redis-cli // 查看服务器是否启动
数据类型
String 、 List 、Set 、Sorted Set 、Hash
要把数据类型放到最前面来学习是因为数据类型非常重要,虽然Redis本质上也是key-value类型的内存数据库,但因为数据类型的存在,而赋予了redis很多特殊的功能。
针对不同数据类型设计的命令
- String : set \ setnx \ get \ getset \ mget \ mset \ msetnx \ incr \ decr \ incrby \ descby
- List : lset \ lpush \ rpush \ llen \ lrange \ ltrim \ lrem \ lpop \ rpop \ blpop \ brpop
- Set : sadd \ srem \ spop \ srandmember \ smove \ scard \ sismember \ sinter \ sinterstore \ sunion \ sunionstore \ sdiff \ sdiffstore \ smembers
- Sorted Set : zadd \ zrem \ zincrby \ zrank \ zrevrank \ zrange \ zrevrang \ zrangebyscore \ zcount \ zcard \ zscore \ zremrangebyrank \ zremrangebyscore
- Hsah : hset \ hget \ hmget \ hmset \ hincrby \ hexists \ hdel \ hlen \ hkeys \ hvals \ hgetall
不同数据类型的使用场景:
- String : 二进制文件、图片文件、css文件(二进制安全)、因为支持incr操作,所以还可以用于一些计数的记录,譬如网站访问次数、博客访问次数等。
- List : 应用场景太广了,譬如文章列表、商品列表、消息队列等等。
- Set : 记录一些不能重复的数据,譬如会员ID、session 、投票次数、电话号码等。
- Sorted Set : 具有先后顺序的数据,譬如约车系统,有位置排序的车次。
- Hash : 通常用于存储对象信息
对所有key适用的命令
exits \ del \ type \ keys \ expire \ randomkey \ rename \renamenx \ ttl \ move
Redis 的排序命令
SORT key [ BY pattern ] [ LIMIT start count ] [GET pattern ] [ ASC|DESC ] [ALPHA ] [ STORE dstkey ]
在redis里面,List \ Set \ Sorted Set 都支持排序,排序功能可以让缓存里的数据被查询出来的时候更便于使用或者展示。
Redis 事务处理
multi
exec | discard
Redis 持久化
内存快照 vs 日志追加
- 内存快照
- 通过save配置项来配置保存策略,可以配置多条规则。
- 在主线程上进行数据复制,会阻塞所有客户端请求。
- 全量的数据备份,数据量大的时候会很影响性能。
- 日志追加
- 把增加、修改数据的命令追加到日志文件尾部。
- 提供了方法来刷新操作系统的缓存写入磁盘的策略。
- 可以在bgrewriteaof来压缩日志文件。
实际上,这两种持久化策略都存在缺陷,要么很影响性能,要么很消耗存储空间,更多的情况下是自己实现持久化,所以实际上持久化的能力并不是选择Redis的主要原因。
在主从同步的学习里面还发现,可以利用从服务器来做持久化的工作。
主从同步
在slave服务器上配置:
slaveof 127.0.0.1 6379
@todo : 明天要配置下本地的redis,然后做个小demo,安装压力测试的工具,测试下redis的能力。
虚拟内存
Redis的VM与操作系统的VM相似,当redis的内存使用量到达配置项指定的阀值时,就会把很少访问的value保存到磁盘中,于此同时把value对应的key都放到内存中,以便快速定位value所在磁盘的位置。
区别与操作系统的虚拟内存功能:
- 操作系统的vm以页为操作单位,如linux操作系统,每页4k,而redis的对象有的少于4k,有的多于4k,redis自己实现一个vm就可以更好地控制换出换入的粒度。
- Redis对交换到磁盘的对象进行压缩,除去指针和对象元数据,能压缩小10倍,可以减少I/O操作和存储空间。
服务器配置
daemonize yes #是否以后台进程运行,默认为no
pidfile /var/run/redis.pid #如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pid
bind 127.0.0.1 #绑定主机IP,默认值为127.0.0.1(注释)
port 6379 #监听端口,默认为6379
timeout 300 #超时时间,默认为300(秒)
loglevel notice #日志记slave-serve-stale-data yes:在master服务器挂掉或者同步失败时,从服务器是否继续提供服务。录等级,有4个可选值,debug,verbose(默认值),notice,warning
logfile /var/log/redis.log #日志记录方式,默认值为stdout
databases 16 #可用数据库数,默认值为16,默认数据库为0
save 900 1 #900秒(15分钟)内至少有1个key被改变
save 300 10 #300秒(5分钟)内至少有300个key被改变
save 60 10000 #60秒内至少有10000个key被改变
rdbcompression yes #存储至本地数据库时是否压缩数据,默认为yes
dbfilename dump.rdb #本地数据库文件名,默认值为dump.rdb
dir ./ #本地数据库存放路径,默认值为 ./
slaveof 10.0.0.12 6379 #当本机为从服务时,设置主服务的IP及端口(注释)
masterauth elain #当本机为从服务时,设置主服务的连接密码(注释)
slave-serve-stale-data yes #在master服务器挂掉或者同步失败时,从服务器是否继续提供服务。
requirepass elain #连接密码(注释)
maxclients 128 #最大客户端连接数,默认不限制(注释)
maxmemory #设置最大内存,达到最大内存设置后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,任到达最大内存设置,将无法再进行写入操作。(注释)
appendonly no #是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认值为no
appendfilename appendonly.aof #更新日志文件名,默认值为appendonly.aof(注释)
appendfsync everysec #更新日志条件,共有3个可选值。no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次(默认值)。
really-use-vm yes
vm-enabled yes #是否使用虚拟内存,默认值为no
vm-swap-file /tmp/redis.swap #虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
vm-max-memory 0 #vm大小限制。0:不限制,建议60-80% 可用内存大小。
vm-page-size 32 #根据缓存内容大小调整,默认32字节。
vm-pages 134217728 #page数。每 8 page,会占用1字节内存。
vm-page-size #vm-pages 等于 swap 文件大小
vm-max-threads 4 #vm 最大io线程数。注意: 0 标志禁止使用vm
hash-max-zipmap-entries 512
hash-max-zipmap-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
activerehashing yes