盐城网站建设首选梦搏网络,wordpress不能安装,重庆网站页面优化,wordpress页面php代码一、redis与memcache总体对比
1.性能
Redis#xff1a;只使用单核#xff0c;平均每一个核上Redis在存储小数据时比Memcached性能更高。
Memcached#xff1a;可以使用多核#xff0c;而在100k以上的数据中#xff0c;Memcached性能要高于Redis。
2.内存使用效率
Mem…一、redis与memcache总体对比
1.性能
Redis只使用单核平均每一个核上Redis在存储小数据时比Memcached性能更高。
Memcached可以使用多核而在100k以上的数据中Memcached性能要高于Redis。
2.内存使用效率
MemCached使用简单的key-value存储Memcached的内存利用率更高。
Redis如果采用hash结构来做key-value存储由于其组合式的压缩其内存利用率会高于Memcached。
3.内存空间和数据量大小
MemCached可以修改最大内存采用LRU算法。Memcached单个key-value大小有限一个value最大只支持1MB。
Redis增加了VM的特性突破了物理内存的限制。Redis单个key-value大小最大支持512MB 。
4.数据结构支持
MemCached数据结构单一仅用来缓存数据。
Redis支持更加丰富的数据类型Redis不仅仅支持简单的k/v类型的数据同时还提供listsetzsethash等数据结构的存储。
可以在服务器端直接对数据进行丰富的操作,这样可以减少网络IO次数和数据体积。
5.可靠性
Memcached只是个内存缓存对可靠性要求低。MemCached不支持数据持久化断电或重启后数据消失但稳定性是有保证的。
Redis对可靠性要求高支持数据持久化和数据恢复允许单点故障同时也会影响部分性能。支持数据的备份即master-slave模式的数据备份。Redis支持数据的持久化可以将内存中的数据保存到磁盘中重启的时候可以再次加载进行使用。
6.应用场景
Memcached动态系统中减轻数据库负载提升性能做缓存适合多读少写大数据量场景。
Redis适用于对读写效率要求都很高数据处理业务复杂和对安全性要求较高的系统。 二、redis与memcache内存管理机制对比
1. Memcached的内存管理机制
Memcached默认使用Slab Allocation机制管理内存其主要思想是按照预先规定的大小将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录以完全解决内存碎片问题。Slab Allocation机制只为存储外部数据而设计也就是说所有的key-value数据都存储在Slab Allocation系统里而Memcached的其它内存请求则通过普通的malloc/free来申请因为这些请求的数量和频率决定了它们不会对整个系统的性能造成影响
2. Redis的内存管理机制
Redis的内存管理主要通过源码中zmalloc.h和zmalloc.c两个文件来实现的。Redis为了方便内存的管理在分配一块内存之后会将这块内存的大小存入内存块的头部。如图 5所示real_ptr是redis调用malloc后返回的指针。redis将内存块的大小size存入头部size所占据的内存大小是已知的为 size_t类型的长度然后返回ret_ptr。当需要释放内存的时候ret_ptr被传给内存管理程序。通过ret_ptr程序可以很容易的算出 real_ptr的值然后将real_ptr传给free释放内存。Redis采用的是包装的mallc/free相较于Memcached的内存管理方法来说要简单很多。 三、 Redis和Memcached的集群实现机制对比
1. Memcached的分布式存储
Memcached本身并不支持分布式因此只能在客户端通过像一致性哈希这样的分布式算法来实现Memcached的分布式存储。
当客户端向Memcached集群发送数据之前首先会通过内置的分布式算法计算出该条数据的目标节点然后数据会直接发送到该节点上存储。但客户端查询数据时同样要计算出查询数据所在的节点然后直接向该节点发送查询请求以获取数据。
2. Redis的分布式存储
Redis在服务器端构建分布式存储。Redis Cluster是一个实现了分布式且允许单点故障的Redis高级版本它没有中心节点具有线性可伸缩的功能。其中节点与节点之间通过二进制协议进行通信节点与客户端之间通过ascii协议进行通信。在数据的放置策略上Redis Cluster将整个key的数值域分成4096个哈希槽每个节点上可以存储一个或多个哈希槽Redis Cluster支持的最大节点数就是4096。Redis Cluster使用的分布式算法crc16( key ) % HASH_SLOTS_NUMBER。
为了保证单点故障下的数据可用性Redis Cluster引入了Master节点和Slave节点。在Redis Cluster中每个Master节点都会有对应的两个用于冗余的Slave节点。这样在整个集群中任意两个节点的宕机都不会导致数据的不可用。当Master节点退出后集群会自动选择一个Slave节点成为新的Master节点。 一redis的安装
1安装
[rootlocalhost ~]# systemctl stop firewalld
[rootlocalhost ~]# setenforce 0 [rootlocalhost ~]# yum -y install gcc* zlib-devel
[rootlocalhost ~]# tar xvzf redis-4.0.9.tar.gz
[rootlocalhost ~]# cd redis-4.0.9/ [rootlocalhost redis-4.0.9]# make 注意
在make的时候可能会出现如下错误提示 解决方法1用make MALLOClibc指定内存分配器为 libc进行编译
解决方法2make clean make distclean [rootlocalhost redis-4.0.9]# make PREFIX/usr/local/redis install
[rootlocalhost ~]# ln -s /usr/local/redis/bin/* /usr/local/bin/
[rootlocalhost redis-4.0.9]# cd /root/redis-4.0.9/utils/
[rootlocalhost utils]# ./install_server.sh 备注
Config file : /etc/redis/6379.conf //配置文件路径
Log file : /var/log/redis_6379.log //日志文件路径
Data dir : /var/lib/redis/6379 //数据文件路径
Executable : /usr/local/redis/bin/redis-server //可执行文件路径
Cli Executable : /usr/local/redis/bin/redis-cli //客户端命令行工具 2查看进程
[rootlocalhost utils]# netstat -anpt | grep redis 3服务控制
[rootlocalhost ~]#/etc/init.d/redis_6379 stop
[rootlocalhost ~]#/etc/init.d/redis_6379 start
[rootlocalhost ~]#/etc/init.d/redis_6379 restart
[rootlocalhost ~]#/etc/init.d/redis_6379 status 4配置参数的修改
[rootlocalhost ~]#vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.10.101 //监听的主机地址
port 6379 //端口
daemonize yes //启用守护进程
pidfile /var/run/redis_6379.pid //指定 PID 文件
loglevel notice //日志级别
logfile /var/log/redis_6379.log //指定日志文件 [rootlocalhost~]#/etc/init.d/redis_6379 restart
[rootlocalhost utils]# netstat -anpt | grep redis 二Redis 命令工具
Ø redis-server用于启动 Redis 的工具
Ø redis-benchmark用于检测 Redis 在本机的运行效率
Ø redis-check-aof修复 AOF 持久化文件
Ø redis-check-rdb修复 RDB 持久化文件
Ø redis-cliRedis 命令行工具。 1redis-cli 命令行工具
1连接本机redis
[rootlocalhost ~]# redis-cli
127.0.0.1:6379 2测试redis服务是否启动
127.0.0.1:6379 ping
PONG 3远程连接
[rootlocalhost ~]#redis-cli -h 192.168.10.101 -p 6379 2获取帮助
Ø help group获取group中的命令列表
Ø help command获取某个命令的帮助
Ø help tab获取可能帮助的主题列表。 备注
Ø help tab获取可能帮助的主题列表。
输入help后按下tab键 1查看所有与 List 数据类型的相关命令
127.0.0.1:6379help list 2查看 set 命令的命令帮助
127.0.0.1:6379help set 3redis-benchmark 测试工具 redis-benchmark 是官方自带的 Redis 性能测试工具可以有效的测试 Redis 服务的性能。
Ø -h指定服务器主机名
Ø -p指定服务器端口
Ø -s指定服务器 socket
Ø -c指定并发连接数
Ø -n指定请求数
Ø -d以字节的形式指定 SET/GET 值的数据大小
Ø -k1keep alive 0reconnect
Ø -rSET/GET/INCR 使用随机 key, SADD 使用随机值
Ø -P通过管道传输numreq请求
Ø -q强制退出 redis。仅显示 query/sec 值
Ø --csv以 CSV 格式输出
Ø -l生成循环永久执行测试
Ø -t仅运行以逗号分隔的测试命令列表
Ø -IIdle 模式。仅打开 N 个 idle 连接并等待。 1测试请求性能
[rootlocalhost ~]#redis-benchmark -h 192.168.10.101 -p 6379 -c 100 -n 100000 备注
Ø -h指定服务器主机名
Ø -p指定服务器端口
Ø -c指定并发连接数
Ø -n指定请求数 MSET (10 keys) 100000 requests completed in 1.02 seconds 100 parallel clients ##100个并发连接 3 bytes payload keep alive: 1 87.25% 1 milliseconds ##87.25%的命令执行时间小于等于1毫秒
99.90% 2 milliseconds
100.00% 2 milliseconds
97943.19 requests per second #每秒的请求数 备注
向 IP 地址为 192.168.10.101、端口为6379 的 Redis 服务器发送 100 个并发连接与100000 个请求测试性能 2测试存取性能
[rootlocalhost ~]#redis-benchmark -h 192.168.10.101 -p 6379 -q -d 100 备注
Ø -h指定服务器主机名
Ø -p指定服务器端口
Ø -d以字节的形式指定 SET/GET 值的数据大小
Ø -q强制退出 redis。仅显示 query/sec 值 PING_INLINE: 121506.68 requests per second
PING_BULK: 124378.11 requests per second
SET: 121654.50 requests per second
GET: 122100.12 requests per second
INCR: 118764.84 requests per second
LPUSH: 112612.61 requests per second
RPUSH: 118623.96 requests per second
LPOP: 107874.87 requests per second
RPOP: 114416.48 requests per second
SADD: 123304.56 requests per second
HSET: 122249.38 requests per second
SPOP: 128040.97 requests per second
LPUSH (needed to benchmark LRANGE): 116686.12 requests per second
LRANGE_100 (first 100 elements): 40016.00 requests per second
LRANGE_300 (first 300 elements): 11991.85 requests per second
LRANGE_500 (first 450 elements): 7381.71 requests per second
LRANGE_600 (first 600 elements): 5230.67 requests per second
MSET (10 keys): 92421.44 requests per second 备注
测试存取大小为 100 字节的数据包的性能
(1)PING_INLINE:每秒完成多少次PING操作 (2)GET:每秒完成多少次GET key vlaue (3)SET:每秒完成多少次SET key vlaue (4)INCR:每秒完成多少次原子计数 (5)MSET:每秒多个key vlaue请求次数 3set 与 lpush 操作性能
[rootlocalhost ~]# redis-benchmark -t set,lpush -n 100000 -q 备注
Ø -n指定请求数
Ø -q强制退出 redis。仅显示 query/sec 值
Ø -t仅运行以逗号分隔的测试命令列表 SET: 121951.22 requests per second
LPUSH: 127226.46 requests per second 备注
测试本机上 Redis 服务在进行 set 与 lpush 操作时的性能。
Lpush 命令将一个或多个值插入到列表头部 三Redis 数据库常用命令
Ø set存放数据基本的命令格式为 set key value。
Ø get获取数据基本的命令格式为 get key。 127.0.0.1:6379set teacher zhanglong
127.0.0.1:6379get teacher 1key 相关命令
在 Redis 数据库中与 key 相关的命令主要包含以下几种。
1添加键值对
使用 keys 命令可以取符合规则的键值列表通常情况可以结合*、等选项来使用。
127.0.0.1:6379set k1 1
OK
127.0.0.1:6379set k2 2
OK
127.0.0.1:6379set k3 3
OK
127.0.0.1:6379set v1 4
OK
127.0.0.1:6379set v5 5
OK 2查看当前数据库中所有键
127.0.0.1:6379KEYS *
1) teacher
2) k1
3) k2
4) k3
5) v1
6) v5
127.0.0.1:6379set v22 5
OK 3查看当前数据库中以 v 开头的数据
127.0.0.1:6379KEYS v*
1) v1
2) v5
3) v22 4查看当前数据库中以 v 开头后面包含任意一位的数据
127.0.0.1:6379KEYS v?
1) v1
2) v5 5查看当前数据库中以 v 开头 v 开头后面包含任意两位的数据
127.0.0.1:6379KEYS v??
1) v22 2exists
exists 命令可以判断键值是否存在 127.0.0.1:6379exists teacher
(integer) 1
结果为1表示 teacher 键是存在 127.0.0.1:6379exists tea
(integer) 0
结果为0表示 tea 键不存在 3del
del 命令可以删除当前数据库的指定 key
127.0.0.1:6379keys *
1) teacher
2) v1
3) v22
4) k3
5) k1
6) k2
7) v5
127.0.0.1:6379 del v5
(integer) 1
127.0.0.1:6379get v5
(nil) 4type
使用 type 命令可以获取 key 对应的 value 值类型
127.0.0.1:6379type k1
string 备注
redis支持的数据类型
String最简单的类型就是普通的set和get作key value缓存。 Hash类似map的一种结构一般就是可以将结构化的数据比如一个对象给缓存在redis里ListList是有序列表可以通过list存储一些列表型的数据结构类似粉丝列表、文章的评论列表之类的东西SetSet是无序集合自动去重。Sorted SetSorted Set是排序的set去重但可以排序写进去的时候给一个分数自动根据分数排序。 5rename
rename 命令是对已有 key 进行重命名
在实际使用过程中建议先用 exists 命令查看目标 key 是否存在然后再决定是否执行 rename 命令以避免覆盖重要数据
127.0.0.1:6379keys v*
1) v1
2) v22
127.0.0.1:6379rename v22 v2
OK
127.0.0.1:6379keys v*
1) v1
2) v2
127.0.0.1:6379get v1
4
127.0.0.1:6379get v2
5
127.0.0.1:6379rename v1 v2
OK
127.0.0.1:6379get v1
(nil)
127.0.0.1:6379get v2
4 6renamenx
renamenx 命令的作用是对已有 key 进行重命名并检测新名是否存在。
使用renamenx 命令进行重命名时如果目标 key 存在则不进行重命名。
127.0.0.1:6379keys *
1) teacher
2) k3
3) k1
4) k2
5) v2
127.0.0.1:6379get teacher
zhanglong
127.0.0.1:6379get v2
4
127.0.0.1:6379renamenx v2 teacher
(integer) 0
127.0.0.1:6379keys *
1) teacher
2) k3
3) k1
4) k2
5) v2
127.0.0.1:6379get teacher
zhanglong
127.0.0.1:6379get v2
4 7dbsize
dbsize 命令的作用是查看当前数据库中 key 的数目。
127.0.0.1:6379 dbsize
(integer) 5 四多数据库常用命令
1多数据库间切换
Redis 在没有任何改动的情况下默认包含 16 个数据库数据库名称是用数字 0-15 来依次命名的 1切换至序号为 10 的数据库
127.0.0.1:6379select 10
OK 2切换至序号为 15 的数据库
127.0.0.1:6379[10]select 15
OK 3切换至序号为 0 的数据库
127.0.0.1:6379[15]select 0 2多数据库间移动数据
Redis 的多数据库在一定程度上是相对独立的例如在数据库 0 上面存放 k1 的数据在其它 1-15 的数据库上是无法查看到的。 127.0.0.1:6379set k1 100
OK
127.0.0.1:6379get k1
100
127.0.0.1:6379select 1
OK
127.0.0.1:6379[1]get k1
(nil) 127.0.0.1:6379[1]select 0 //切换至目标数据库 0
OK
127.0.0.1:6379get k1 //查看目标数据是否存在
100
127.0.0.1:6379move k1 1 //将数据库 0 中 k1 移动到数据库 1 中
(integer) 1
127.0.0.1:6379select 1 //切换至目标数据库 1
OK
127.0.0.1:6379[1]get k1 //查看被移动数据
100
127.0.0.1:6379[1] select 0
OK
127.0.0.1:6379 get k1 //在数据库 0 中无法查看到 k1 的值
(nil) 3清除数据库内数据
清空当前数据库数据使用 FLUSHDB
命令实现清空所有数据库的数据使用 FLUSHALL 命令实现 五Redis 持久化
Redis 的所有数据都是保存在内存中然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”)也可以把每一次数据变化都写入到一个 append only file(aof)里面(这称为“全持久化模式”)。 由于 Redis 的数据都存放在内存中如果没有配置持久化Redis 重启后数据就全丢失了。所以需要开启 Redis 的持久化功能将数据保存到磁盘上当 Redis 重启后可以从磁盘中恢复数据。Redis 提供两种方式进行持久化一种是 RDBRedis DataBase 持久化原理是将 Reids在内存中的数据库记录定时 dump 到磁盘上的 RDB 持久化另外一种是 AOFappend only file持久化原理是将 Reids 的操作日志以追加的方式写入文件。 1RDB 和 AOF 的区别
1RDB是什么
默认采用的方法
RDB持久化是把当前进程数据生成快照保存到硬盘的过程触发RDB持久化过程分为手动触发和自动触发。
触发机制手动触发分别对应为save和bgsave命令 save命令阻塞当前Redis服务器直到RDB过程完成为止对于内存比较多的实例会造成时间阻塞。线上环境不建议使用。 bgsave命令Redis进程执行fork用于创建进程的函数操作创建子进程RDB持久化过程由子进程负责完成后自动结束。阻塞只发生在fork阶段。 2RDB的优缺点 RDB的优点 RDB是一个紧凑压缩的二进制文件代表Redis在某一个时间点上的数据快照。非常适用于备份全量复制等场景。比如每6小时执行bgsave备份并把RDB文件拷贝到远程机器或者文件系统中用于灾难恢复。 Redis加载RDB恢复数据远远快于AOF方式。 RDB的缺点 RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都有执行fork操作创建子进程属于重量级操作频繁执行成本过高。 RDB文件使用特定二进制格式保存Redis版本演进过程中有多个格式的RDB版本存在老版本Redis服务无法兼容新版RDB格式的问题。 二、AOF是什么 AOF(append only file)持久化以独立日志的方式记录每次写命令重启时再重新执行AOF文件中命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性目前已经是Redis持久化的主流 二者选择的标准
牺牲一些性能换取更高的缓存一致性AOF
写操作频繁的时候不启用备份来换取更高的性能待手动运行 save 的时候再做备份RDB 备注
如果redies重启之后需要加载一个持久化文件有限会选择AOF文件。
如果先开启了RDB再开启AOFRDB先执行了持久化那么RDB文件中的内容会被AOF覆盖掉。 3Redis 持久化配置
1RDB 持久化配置
[rootlocalhost ~]# vim /etc/redis/6379.conf 打开 6379.conf 文件之后搜索 save可以看到如下所示配置信息。
Ø save 900 1在 900 秒(15 分钟)之后如果至少有 1 个 key 发生变化则 dump内存快照。Ø save 300 10在 300 秒(5 分钟)之后如果至少有 10 个 key 发生变化则 dump内存快照。Ø save 60 10000在 60 秒(1 分钟)之后如果至少有 10000 个 key 发生变化则dump 内存快照。
dbfilename dump.rdb RDB文件名称 ##254行dir /var/lib/redis/6379 RDB文件路径 ##264行rdbcompression yes 是否进行压缩 ##242行 2AOF 持久化配置
在 Redis 的配置文件中存在三种同步方式它们分别是
appendonly yes 开启AOF持久化默认为no ##673行appendfilename appendonly.aof AOF文件名称 ##677行
# appendfsync always
appendfsync everysec# appendfsync no
always同步持久化每次发生数据变化会立刻写入磁盘
everysec默认推荐每秒异步记录一次默认值
no不同步交给操作系统决定如何同步 aof-load-truncated yes ##769行
忽略最后一条可能存在问题的指令 [rootlocalhost ~]#/etc/init.d/redis_6379 restart 2AOF重写
为了解决 AOF 文件体积不断增大的问题用户可以向 Redis 发送 BGREWRITEAOF命令。BGREWRITEAOF 命令会通过移除 AOF 文件中的冗余命令来重写rewriteAOF文件使 AOF 文件的体积尽可能地变小。
127.0.0.1:6379 bgrewriteaof
Background append only file rewriting started # 在日志进行BGREWRITEAOF时如果no-appendfsync-on-rewrite设置为yes表示新写操作不进行同步fsync只是暂存在缓冲区里避免造成磁盘IO操作冲突等重写完成后再写入。Redis中默认为no
no-appendfsync-on-rewrite no # 当前AOF文件大小是上次日志重写时AOF文件大小两倍时发生BGREWRITEAOF操作
auto-aof-rewrite-percentage 100
备注
100指的是aof文件增长比例指当前aof文件比上次重写的增长比例大小100为两倍 #当前AOF文件执行BGREWRITEAOF命令的最小值避免刚开始启动Reids时由于文件尺寸较小导致频繁的BGREWRITEAOF
auto-aof-rewrite-min-size 64mb 六性能管理
1查看内存信息
192.168.9.236:7001 info memory used_memory:1210776 #已经内存使用的大小以字节为单位 used_memory_human:1.15M # 带单位展示以M为单位 used_memory_rss:7802880 # 从操作系统角度看redis内存占用多少 used_memory_rss_human:7.44M # 带单位展示 maxmemory:1073741824 # 最大内存大小 maxmemory_human:1.00G # 带单位展示 2回收策略
maxmemory-policy回收策略
Ø volatile-lru它允许 Redis 从整个数据集中挑选最近最少使用的 key 进行删除
Ø volatile-ttl按照key的过期时间进行淘汰
Ø volatile-random从已设置过期时间的数据集合中随机挑选数据淘汰
Ø allkeys-lru使用 LRU 算法从所有数据集合中淘汰数据
Ø allkeys-random从数据集合中任意选择数据淘汰
Ø noeviction禁止淘汰数据默认值 备注
设置key的过期时间
expire v1 10
v1的过期时间为10秒 备注
当 Redis 由于内存压力需要回收一个 key 时Redis 首先考虑的不是回收最旧的数据而是在最近最少使用的 key 或即将过期的 key 中随机选择一个 key从数据集中删除 redis设置密码 一、设置方法 方法一通过配置文件redis.conf设置密码 找到requirepass关键字后面就是跟的密码默认情况下是注释掉的即默认不需要密码如下 打开注释设置为自己的密码重启即可 方法二通过命名设置密码 使用redis-cli连接上redis执行如下命令
config set requirepass 123456 执行完毕无需重启退出客户端重新登录就需要输入密码了 二、连接方法
1、连接时输入密码
[rootlocalhost bin]# ./redis-cli -a 123456
2、先连接再输入密码
[rootlocalhost bin]# ./redis-cli127.0.0.1:6379 auth 123456 三、关闭方法
[rootlocalhost bin]# ./redis-cli -a 123456 shutdown 四、区别
1修改配置文件设置的密码永久生效使用命令设置的密码临时生效重启后失效
2修改配置文件设置的密码需要重启生效使用命令设置的密码退出后再登录生效重启后失效
3命令的优先级高于配置文件的优先级