目录:
- redis简介
- Linux环境安装redis
- redis的数据类型和常用命令
- redis多数据库
- redis数据的持久化
- redis的事务
- Redis主从复制(读写分离)、主从切换(一主二从三哨兵)
- redis发布订阅
- redis单线程模型
- redis批量执行命令
- redis禁用或重命名危险
一、Redis简介
官网:https://redis.io/
1、什么是Redis?
Redis是一个完全开源免费的、遵守BSD协议的、高性能的key-value存储系统。它既可基于内存作为高性能缓存,也可将数据持久化到磁盘,是目前最热门的NoSql数据库之一。
了解:BSD协议是一个给于使用者很大自由的协议。可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。
2、我们为什么要使用Redis?
(1).缓存数据,减少对数据库的访问次数,提高响应速度;
(2).性能极高,Redis读取速度可达110000次/s,写速度可达81000次/s ;
(3).支持数据的持久化;
(3).支持丰富的数据结构:String(字符串)、Hash(散列)、List(列表)、Set(集合)以及zset(Sorted Set:有序集合);
......
3、Redis与Memcache的比较
Memcache |
Redis |
|
持久性 |
不支持持久化 |
支持将数据持久化到磁盘 |
灾难恢复 |
宕机后数据消失不可恢复 |
数据可恢复 |
支持的数据结构 |
简单的k/v类型 |
Hash、List、Set、zset等 |
虚拟内存 |
memcache所有数据全部一直存储 在内存中,存储的数据量不能超过 内存的大小。 |
虚拟内存:Redis会将暂时不常用的Values从 内存交换到磁盘中,在内存中只保留Keys的 数据,当这些被换出的Values需要被读取时, Redis则将其再次读回到主内存中。 |
并发 |
Memcache支持多线程,通过CAS 实现线程安全保证数据的一致性; |
Redis是单线程的,且Redis支持事务; |
...... |
总结:Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcached只是简单的K/V缓存。有持久化需求或者对数据结构的处理有高级要求的应用,选择redis。简单的key/value存储,可以选择memcache。
4、Redis的使用场景
> 缓存热数据
> 计数器
> Redis 作分布式锁
> 最新列表
例如要展示最新新闻列表,如果总数量很大的情况下,尽量不要使用select a from A limit 10这种low操作,尝试redis的 LPUSH命令构建List。
> 排行榜
可以使用sorted set(有序集)来构建,命令:ZADD。
二、Linux安装Redis
(1)、安装gcc
gcc:linux系统编译器,如果没有安装,在执行make命令时会报Command not found;
>执行如下命令用来查看是否已安装gcc
# gcc -v
出现如下信息表示已安装:gcc version 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
>否则,执行如下命令,先安装gcc
# yum install gcc-c++
(2)、安装tcl(非必须,如果不需要测试Redis也可以不安装)
tcl:tcl是一种脚本语言,而Redis的测试用例是tcl脚本,安装后如果需要测试Redis,我们就需要安装tcl解释器,否则在步骤(4)执行make test时会报:You need 'tclsh8.5' in order to run the Redis test。
执行如下命令安装tcl:
# cd /usr/local
# mkdir tcl
# cd tcl
# wget http://downloads.sourceforge.net/tcl/tcl8.6.3-src.tar.gz
# tar -zxvf tcl8.6.3-src.tar.gz
# cd tcl8.6.3/unix/
# ./configure
# make
# make install
(3)、安装Redis
# cd /usr/local
# mkdir redis
# cd redis
# wget http://download.redis.io/releases/redis-4.0.10.tar.gz
# tar -zxvf redis-4.0.10.tar.gz
# cd redis-4.0.10
# make
# make PREFIX=/usr/local/redis install
其中PREFIX=/usr/local/redis可以省略,省略redis默认会安装到/usr/local/bin目录下。
(4)、测试Redis
# cd src
# make test
通过以上命令就可以对redis进行测试。返回"\o/ All tests passed without errors!"表示所有测试都没有错误。
(5)初步配置redis
# cd /usr/local/redis/redis-4.0.10
# vi redis.conf
修改redis配置文件中的下面两个属性:
> daemonize no ——> daemonize yes
配置redis作为守护进程运行。daemonize 设置为no时,退出或关闭终端都会导致redis进程退出;而设置为yes redis会在后台一直运行。
另外还有一个属性:pidfile /var/run/redis_6379.pid,表示当redis服务以守护进程方式运行时,redis默认会把pid(进程Id)写入/var/run/redis_6379.pid,服务运行时该文件就存在,服务一旦停止该文件就自动删除。
> timeout 0 ——> timeout 600
表示客户端闲置多长时间关闭连接;
redis的配置参数很多,此处只修改两项最基本的配置,其他后面会涉及到的配置我们在后面会讲,剩余配置大家可自行了解。
(6)、设置redis开机自启动
# vi /etc/init.d/redis
init.d目录下原本不存在redis文件,执行vi /etc/init.d/redis时会新建redis文件;
> 找到redis启动脚本
# find / -name 'redis_init_script '
启动脚本所在路径:/usr/local/redis/redis-4.0.10/utils/redis_init_script
> 拷贝启动脚本文件
#cp /usr/local/redis/redis-4.0.10/utils/redis_init_script /etc/init.d/redis
> 修改redis文件
# vi /etc/init.d/redis
> 修改以下4处为自己的安装路径,保存
EXEC=/usr/local/redis/redis-4.0.10/src/redis-server
CLIEXEC=/usr/local/redis/redis-4.0.10/src/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/usr/local/redis/redis-4.0.10/redis.conf"
> 设置权限
# chmod 777 /etc/init.d/redis
> 设置开机自启动【此处的redis就代表之前init.d下的redis】
# chkconfig redis on
(7)、启动或关闭redis服务
# service redis start
# service redis stop
(8)、使用redis,简单示例如下【退出redis客户端命令:quit】
[root@JD /]# ./usr/local/redis/redis-4.0.10/src/redis-cli
127.0.0.1:6379> set felixRedis:username yuanlong
OK
127.0.0.1:6379> set felixRedis:password 111111
OK
127.0.0.1:6379> get felixRedis:username
"yuanlong"
127.0.0.1:6379> get felixRedis:password
"111111"
127.0.0.1:6379> quit
[root@JD /]#
三、Redis数据类型和常用命令
> Redis目前支持5种数据类型,分别是:
String(字符串)
Hash(散列)
List(列表)
Set(集合)
Sorted Set(zSet:有序集合)
下面分别介绍五种数据类型及相应的操作命令,Redis总共有14个命令组200多个命令。另外注意Redis的命令不区分大小写,但是key严格区分大小写。
>>> String(字符串):Value最大值为512M
命令 |
描述 |
set key value |
设值,若给定的Key已经存在,则被覆盖 |
setnx key value |
若给定的key不存在,执行set操作,返回1; 若给定的Key已经存在,不做任何操作,返回0; |
get key |
获值 |
mset key value[key value ...] |
同时设置一个或多个Key-Value键值对,如 果某个给定key已经存在,那么MSET新值 会覆盖旧值,mset是原子操作,所有Key都 会在同一时间被设置 |
msetnx key value[key value ...] |
同mset,但是仅当所有key都不存在时 才会进行set操作 |
mg |