redis高性能数据库
经常用Redis做什么
在公司中经常用Redis来做数据库的缓存,用来缓存一些经常被客户端访问到的数据,从而减轻后端数据的压力
常见的缓存数据库有哪些
Redis memcache
相同点:1.都是缓存数据(内存) 2.都是以key-value的形式存储Name=dgf
不同点:redis支持数据的持久化(存在内存中的数据不会随着系统或服务的重启而丢失),Redis支持value的数据类型相对较多
memcache比Redis支持的value的数据类型较少,memcache不支持持久化
一丶Redis概述:
概述:redis是一个可持久化的单进程单线程key-value类型高速内存缓存系统,和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(列表)、set(集合)、zset(sortedset --有序集合)和hashs(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集更丰富的操作
与memcached一样,为了保证效率,数据都是缓存在内存中,区别的是Redis会定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作,是已知心更难最快的key-value db,并且再次基础上实现了master-slave(主从)同步,当前Redis的应用已经非常广泛,国内像新浪,淘宝,国外像Flickr,GitHub都在使用Redis的缓存服务。官网地址:https://redis.io/,目前由Redis项目的开发和维护由vmware厂商负责提供支持;
优点:
1.性能极高--Redis能支持通过100k+每秒的读写频率
2.丰富的数据类型-Redis迟滞二进制案例的strings,lists,hashes,sets及ordered sets 数据类型操作
3.原子性-redis的所有的操作都是原子性(既所有操作要么成功要么失败不执行),同时Redis还支持对几个操作全并后的原子性执行。
4.redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们不需要进行随机访问。
二丶应用场景分析:
mysql+Memcached架构的问题:实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题:
1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间。
2.Memcached与MySQL数据库数据一致性问题。
3.Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支持。
4.跨机房cache同步问题。
Redis的应用场景:
redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢?
1.redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
2.Redis支持数据的备份,即master-salve模式的数据备份
3.Redis支持数据的持久化,可以将内存中二段数据保持在磁盘中,重启的时候可以再次加载进行使用。
4.Memcached:动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息,好友信息,文章信息等)。
redis:适用于对读写效率要求很高,数据处理业务负载和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性,读写要求都很高)。
三丶redis的数据回收策略:
Redis的回收策略: 用的LRU算法
volatile-lru: 从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰:
Set name dgf 10;
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰;
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰;
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰;
allkeys-random: 从数据集(server.db[i].dict)中任意选择数据淘汰
no-emviciton(驱逐):禁止驱逐数据
四丶搭建redis
1.安装Redis
这里使用的是redis-6.2.6版本
[root@C7--07 ~]# tar zxvf redis-6.2.6.tar.gz
[root@C7--07 ~]# cd redis-6.2.6
[root@C7--07 redis-6.2.6]# make
[root@C7--07 redis-6.2.6]# echo $?
[root@C7--07 redis-6.2.6]# cd
[root@C7--07 ~]# mkdir -p /usr/local/redis
[root@C7--07 ~]# cp /root/redis-6.2.6/src/redis-server /usr/local/redis/ #服务端程序
[root@C7--07 ~]# cp /root/redis-6.2.6/src/redis-cli /usr/local/redis/ #客户端程序
[root@C7--07 ~]# cp /root/redis-6.2.6/redis.conf /usr/local/redis/ #主配置文件
[root@C7--07 ~]# ls /usr/local/redis/
redis-cli redis.conf redis-server
[root@C7--07 ~]# sed -i '/^bind/s/bind .*/bind 192.168.10.209/g' /usr/local/redis/redis.conf #修改为本机地址
[root@C7--07 ~]# sed -i '/protected-mode/s/yes/no/g' /usr/local/redis/redis.conf #关闭redis的保护模式
[root@C7--07 ~]# sed -i '/daemonize/s/no/yes/g' /usr/local/redis/redis.conf #开启redis的后台守护进程模式
[root@C7--07 ~]# sed -i '/requirepass/s/foobared/123.com/g' /usr/local/redis/redis.conf #设置redis的密码为123.com
[root@C7--07 ~]# sed -i '/requirepass 123.com/s/^#//g' /usr/local/redis/redis.conf #开启redis的密码
编写启动停止redis脚本
[root@C7--07 ~]# cat <<END >>/etc/init.d/redis
#!/bin/sh
# chkconfig: 2345 80 90
# description: Start and Stop redis
#PATH=/usr/local/bin:/sbin:/usr/bin:/bin
REDISPORT=6379
EXEC=/usr/local/redis/redis-server
REDIS_CLI=/usr/local/redis/redis-cli
PIDFILE=/var/run/redis_6379.pid
CONF="/usr/local/redis/redis.conf"
AUTH="123.com"
LISTEN_IP=$(netstat -utpln |grep redis-server |awk '{print $4}'|awk -F':' '{print $1}' |uniq)
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
if [ "$?"="0" ]
then
echo "Redis is running..."
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$REDIS_CLI -h $LISTEN_IP -p $REDISPORT -a $AUTH SHUTDOWN &>>/dev/null
while [ -x ${PIDFILE} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
restart|force-reload)
${0} stop
${0} start
;;
*)
echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
exit 1
esac
END
赋权、启动
[root@C7--07 ~]# chmod 755 /etc/init.d/redis
[root@C7--07 ~]# chkconfig --add redis
[root@C7--07 ~]# /etc/init.d/redis start
Starting Redis server...
Redis is running...
[root@C7--07 ~]# netstat -autpln |grep redis
tcp 0 0 192.168.10.209:6379 0.0.0.0:* LISTEN 89272/redis-server
调整Redis服务
[root@C7--07 ~]# cp /root/redis-6.2.6/src/{redis-benchmark,redis-check-rdb,redis-check-aof,redis-sentinel} /usr/local/redis/
[root@C7--07 ~]# ls /usr/local/redis/
redis-benchmark redis-check-rdb redis.conf redis-server redis-check-aof redis-cli redis-sentinel
[root@C7--07 ~]# ln -s /usr/local/redis/redis-cli /usr/bin/redis
[root@C7--07 ~]# redis -h 192.168.10.209 -p 6379 -a 123.com
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.10.209:6379> exit
到这里redis已经安装完成
结合php测试redis
[root@localhost redis-6.2.6]# yum -y install httpd php php-devel
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
软件包 httpd-2.4.6-67.el7.centos.x86_64 已安装并且是最新版本
软件包 php-5.4.16-42.el7.x86_64 已安装并且是最新版本
没有可用软件包 php-devel。
无须任何处理
[root@localhost redis-6.2.6]# php -v
PHP 5.4.16 (cli) (built: Nov 6 2016 00:29:02)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
[root@localhost ~]# tar zxvf phpredis-4.0.2.tar.gz
[root@localhost ~]# vim /etc/yum.repos.d/linux.repo
[linux]
name=linux
baseurl=file:///mnt/
enabled=1
gpgcheck=0
[php]
name=php
baseurl=file:///root/php
enabled=1
gpgcheck=0
[root@localhost ~]# yum -y install httpd php php-devel
[root@localhost ~]# cd phpredis-4.0.2
[root@localhost phpredis-4.0.2]# /usr/bin/phpize
[root@localhost phpredis-4.0.2]# ./configure --with-php-conf=/usr/bin/php-config
[root@localhost phpredis-4.0.2]#make && make install
[root@localhost phpredis-4.0.2]# echo -e "extension_dir = \"/usr/lib64/php/modules/\"\nextension = redis/so" >> /etc/php.ini
[root@localhost phpredis-4.0.2]# systemctl start httpd
[root@localhost phpredis-4.0.2]# netstat -utpln |grep 80
tcp6 0 0 :::80 :::* LISTEN 21507/httpd