1、Redis概述
NoSQL,(Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
当下已经存在很多的NoSQL数据库,比如MongoDB、Redis、Riak、HBase、Cassandra等等。NoSQL可以大体上分为4个种类:键值(Key-Value)数据库、面向文档(Document-Oriented)数据库、列存储(Wide Column Store/Column-Family)数据库以及图(Graph-Oriented)数据库。
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。适用的场景有储存用户信息,比如会话、配置文件、参数、购物车等等。这些信息一般都和ID(键)挂钩,这种情景下键值数据库是个很好的选择。Redis在国内的使用非常普遍,不仅包括BAT、微博、搜狐、小米、唯品会等,互联网创业公司几乎也都选择了Redis。
Redis 的优势:
1) 性能极高,Redis能读的速度是110000次/s,写的速度是81000次/s 。
2) 丰富的数据类型 , Redis支持二进制的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
3) Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性。
等等。
注意:Redis是内存数据库,所有数据运行在内存中,但是可以持久化到硬盘。Redis应用场景有缓存、计数器、队列、排行榜等等。
2、Redis的下载
(官网redis.io国内直接访问不了)
Linux版本下载:
http://www.redis.cn/download.html
Windows版本下载:
Redis 没有官方的Windows版本,
但是微软开源技术团队开发和维护着Win64 的版本。
https://github.com/MicrosoftArchive/redis/releases
3、Redis在windows下的安装
1)首先解压Redis安装包,在运行中输入cmd,然后把目录指向解压的Redis目录。
2、启动命令
redis-server redis.windows.conf,出现下图显示表示启动成功了。如果想方便的话,可以把 redis 的路径加到系统的环境变量里,这样就省得再输路径了,后面的那个 redis.windows.conf 可以省略。
4、设置Redis服务
1)上面虽然启动了redis,但是只要一关闭cmd窗口,redis就会消失。所以可以redis设置成windows下的服务。首先我们发现是没有Redis服务的
2)、设置服务命令
redis-server --service-install redis.windows-service.conf --loglevel verbose
输入命令之后没有报错,表示成功了,刷新服务,会看到多了一个redis服务
3)、常用的redis服务命令。
卸载服务:redis-server --service-uninstall
开启服务:redis-server --service-start
停止服务:redis-server --service-stop
4)、启动服务
5)、测试Redis,输入命令:redis-cli.exe –h 127.0.0.1 –p 6379 连接服务端(直接redis-cli一般也可以,连接远程服务器语法:redis-cli -h host -p port -a password)
安装测试成功。 这里只是做简单的安装,部署服务使用,要更深入进行了解。
6)如何设置服务器密码:
1)方式一、
config get requirepass //获取当前密码
config set requirepass "password"//设置当前密码,服务重新启动后又会置为默认,即无密码;不建议此种方式
2)方式二:打开配置文件,找到下面第一句后加requirepass yourpassword
# requirepass foobared
requirepass yourpassword //此处注意,行前不能有空格
(如果是设置成了服务,需要在redis.windows-service.conf中设置)
重新设置密码后,登录后需要验证才能获取操作权限
auth 命令进行验证,如auth 123456
5、Redis 数据类型及常见操作命令
Redis本质上是一个key-value数据库,首先看它的key。它的key是非二进制安全的字符串类型,所有key中不能包含空格、转义字符是不行的,如“my key”、“mykey ”。
我们可以在使用时定义一种key的格式,如object-type:id:field(实例:user:100:name)
Key定义时不要太长(占内存,查询慢)或太短。
Key相关操作命令:
exists key //key是否存在
del key1,key2,…. //删除key
type key//返回key对应的value的类型
keys pattern//返回匹配指定模式的所有key,支持*、?、[abc]等
接下来看value,Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
1) string字符串
如: set school nf //设置键值
get school //通过键获取值
set number 10
incr number //使数值+1
decr number //使数值-1
mset school nf address Zhuhai //设置多个键值
mget school number //一次获取多个值
2) hash哈希:Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
如:hmset student name 张三 gender 男 age 18 //设置
hget student name //获取某字段的值
hgetall student //获取所有字段的值
hexists student name //判断某字段是否存在
hdel student name //删除某个或几个字段
3) list列表:Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
如:lpush student 张三
lpush student 李四
lpush student 王五 //将值插入到列表的头部(左边),尾部(右边)用rpush
lrange student 0 2 //获取列表指定范围内的元素
llen student //获取列表长度
lindex student 0 //通过索引获取列表某个元素
lpop student //移除列表的第一个元素(移除最后一个用rpop)
4) set集合:Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
如:sadd books c#
sadd books java //向集合添加成员
smembers books //列出集合所有成员
scard books//返回集合成员数量
spop books//移除并返回集合中的一个随机元素
srem books c# java js //移除集合中n个元素
5) zset有序集合:Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
如:zadd books 1 c#
zadd books 3 java
zadd books 2 js//向有序集合添加成员或更新成员
zrange books 0 10 [withscores]
//返回索引区间内的成员(可选项:带分数)
zcard books//返回集合成员数
zcount books 0 10//返回指定区间分数内的成员数
zrank books c#//返回指定成员的索引
zscore books java//返回指定成员的分数值
zrem books c# java js//移除集合指定的n个成员
6、Redis持久化
Redis是支持持久化的一个内存数据库,经常需要将内存中的数据同步到磁盘中保证持久化。redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时 dump到磁盘上的RDB文件),另外一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件) 。
1)二者的区别:
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录
2)二者优缺点:
RDB存在哪些优势呢?
1). 一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的。比如,你可能打算每个小时归档一次最近24小时的数 据,同时还要每天归档一次最近30天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。
2). 对于灾难恢复而言,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。
3). 性能最大化。对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。
4). 相比于AOF机制,如果数据集很大,RDB的启动效率会更高。
RDB又存在哪些劣势呢?
1). 如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么RDB将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。
2). 由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。
AOF的优势有哪些呢?
1). 该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其 效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变 化都会被立即记录到磁盘中。可以预见,这种方式在效率上是最低的。至于无同步,无需多言,我想大家都能正确的理解它。
2). 由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据 一致性的问题。
3). 如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创 建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。
4). AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建。
AOF的劣势有哪些呢?
1). 对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
2). 根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。
二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。rdb这个就更有些 eventually consistent的意思了。
3)常用配置
1)RDB持久化配置
Redis会将数据集的快照dump到dump.rdb文件中。此外,我们也可以通过配置文件来修改Redis服务器dump快照的频率,在打开redis.windows.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内存快照。
2)AOF持久化配置
在Redis的配置文件redis.windows.conf中存在三种同步方式,它们分别是:
appendfsync always #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。
appendfsync no #从不同步。高效但是数据不会被持久化。
7、Jedis入门
Jedis是Redis官方首选的JAVA客户端开发包。
jar包下载地址:
https://mvnrepository.com/artifact/redis.clients/jedis
详细请看代码案例。