Redis 简介
Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
Redis 定义
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
redis的官网地址,非常好记,是redis.io。(域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地)
目前,Vmware在资助着redis项目的开发和维护。
Redis优点:
对数据高并发读写
对海量数据的高效率存储和访问
对数据的可扩展性和高可用性
Redis缺点:
redis(ACID处理非常简单)
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。
无法做到太复杂的关系型数据库模型
Redis持久化两种机制rdb和aof
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
redis的安装
redis的服务端安装(在SecureCRTS里进行操作)
gcc编译c的,因为redis是c编写的,所以我们先安装下gcc、
yum install gcc-c++
下载redis压缩包
reids的各个版本的下载地址:http://download.redis.io/releases/
第一种方式是 在线安装
yum -y install wget
wget http://download.redis.io/releases/redis-5.0.2.tar.gz
第二种是直接去reis官网下载离线安装包,上传到Linux中,推荐使用第二种
在SecureCRTS里面输入指令Tar -xvf redis-5.0.2.tar.gz(解压)
然后输入cd redis-5.0.2/(进入目录)
然后输入make(编译)
修改配置文件 redis.conf
输入vi redis.conf
因为SecureCRTS里面不能按insert键来直接来修改,所以我们直接在我们的虚拟机里进行修改。
如图所示:
将配置文件中的 daemonize no 改成 daemonize yes 。这是 开启守护进程,不开启的话,不能做其他操作
启动 redis
可以操作如下(指定redis.conf)
./src/redis-server redis.conf
如图所示:
使用reids客户端工具 reids-cli 测试是否成功
./src/redis-cli (使用redis)
连接上后运行ping 命令。如果输出如下结果就代表成功了:
可视化管理工具redis-desktop-manager安装与配置
双击redis-desktop-manager-0.8.8.384.exe即可
配置远程登录
vi /etc/redis/redis.conf #编辑redis配置文件
#bind 127.0.0.1 #注释这一行(69行)
配置密码登录
vi /etc/redis/redis.conf #编辑redis配置文件
#找到下面这一行并去除注释,并添加密码(396行)
#requirepass foobared #修改前
requirepass 123456 #修改后
配置完成密码后,以后登录就密码按下面的命令进行登录
按以前的会报错
如图所示:
所以配置完成密码后,就得用./src/redis-cli -h 127.0.0.1 -p 6379 -a 123456进行登录(123456就是刚刚自己修改之后的密码)
如图所示:
重启redis或虚拟机
service redis-server restart
#reboot
测试使用客户端工具连接
想让客户端工具连接成功,就必须对防火墙就行修改(为了简单省事可以直接关闭防火墙)
开放端口
firewall-cmd --zone=public --add-port=6379/tcp --permanent
跟新防火墙规则
firewall-cmd --reload
防火墙列表
firewall-cmd --zone=public --list-ports
防火墙状态
systemctl status firewalld
启动防火墙
systemctl start firewalld
关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
下面代表连接成功:
当我们连接上后就可以进行一些操作
redis 命令操作
这里是使用 redis-cli 进行命令行操作
redis db0-15 的概念
redis有没有什么方法使不同的应用程序数据彼此分开同时又存储在相同的实例上呢?就相当于mysql数据库,不同的应用程序数据存储在不同的数据库下。
redis下,数据库是由一个整数索引标识,而不是由一个数据库名称。默认情况下,一个客户端连接到数据库0。redis配置文件中下面的参数来控制数据库总数:
databases 16
可以通过下面的命令来切换到不同的数据库下
select 2
随后,所有的命令将使用数据库3,知道你明确的切换到另一个数据库下。
每个数据库都有属于自己的空间,不必担心之间的key冲突。
不同的数据库下,相同的key取到各自的值。
flushdb命令清除数据,只会清除当前的数据库下的数据,不会影响到其他数据库。
flushall命令会清除这个实例的数据。在执行这个命令前要格外小心。
redis的数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)
及zset(sorted set:有序集合)。
String(字符串)
string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
基本操作(curd):
设置值set key value
获取值 get key
删除值 del key
设置值定时有效过时则会返回nil(在reids中nil代表null的意思)
setex key seconds value
使用setrange 替换字符 offset 表示从第几位开始value是替换的值
setrange key offset value
如果不存在就赋值返回为1,如果存在就返回为0
setnx key value
注意:一个键最大能存储 512MB。
Hash(哈希)
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
实例
redis 127.0.0.1:6379> HMSET cpc field1 "Hello" field2 "World"
"OK"
redis 127.0.0.1:6379> HGET cpc field1
"Hello"
redis 127.0.0.1:6379> HGET cpc field2
"World"
注意:实例中我们使用了 Redis HMSET, HGET 命令,HMSET 设置了两个 field=>value 对, HGET 获取对应 field 对应的 value。每个 hash 可以存储 232 -1 键值对(40多亿)。
List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。像java里的队列
Lpush从头部添加一个元素
Rpush从尾部添加一个元素
实例
redis 127.0.0.1:6379> lpush test redis
(integer) 1
redis 127.0.0.1:6379> lpush test mongodb
(integer) 2
redis 127.0.0.1:6379> lpush test rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange test 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>
注:列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
Set(集合)
Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
sadd 命令:添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的 set 不存在则返回错误。
sadd key member
实例:
redis 127.0.0.1:6379> sadd myset redis
(integer) 1
redis 127.0.0.1:6379> sadd myset mongodb
(integer) 1
redis 127.0.0.1:6379> sadd myset rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd myset rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers myset
1) "redis"
2) "rabitmq"
3) "mongodb"
注意:以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。 set 集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。
zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zadd 命令
添加元素到集合,元素在集合中存在则更新对应score
zadd key score member
实例:
redis 127.0.0.1:6379> zadd myzset 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd myzset 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd myzset 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd myzset 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE myzset 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"
谢谢大家,多多指教!!!