1. Redis概述
1.1. 什么是NoSql
NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,它泛指非关系型的数据库。随着互联网2003年之后web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的交友类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
关系型数据库:就是以关系模型来建模的数据库管理系统。关系模型就是以行和列组成二维表。
Web1.0:只提供数据的读的能力
Web2.0:更强调写的能力。论坛,购物,贴吧…
Web3.0: 移动化,物联化供数据的读能力,虚拟化,智能化、云计算。
Web4.0 直播(并发技术)、AI(学习能力)、大数据(IT-DT)
1.1.2. 分类
http://www.nosql-database.org/
Redis和Memcached都是key-value类型的Nosql,主要用来做缓存。
1.2. Redis是什么
Redis 是一个高性能的开源的、C语言写的Nosql(非关系型数据库),数据保存在内存中。
Redis 是以key-value形式存储,和传统的关系型数据库不一样。不一定遵循传统数据库的一些基本要求,比如说,不遵循sql标准,事务,表结构等等,非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
Java中数据结构:String,数组,list,set map…
Redis提供了很多的方法,可以用来存取各种数据结构的数据。
1.3. 特点(优势)
1.数据保存在内存,存取速度快,并发能力强
2.它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、 zset(sorted set --有序集合)和hash(哈希类型)。
3.redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库(如MySQL)起到很好的补充作用。
4.它提供了Java,C/C++,C#,PHP,JavaScript等客户端,使用很方便。
5.Redis支持集群(主从同步)。数据可以主服务器向任意数量从的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。
6.支持持久化,可以将数据保存在硬盘的文件中
7.支持订阅/发布(subscribe/publish)功能 QQ群
1、数据存放:存放到内存中,还能不定期持久化到磁盘。存取速度快,并发能力强,断电后数据不丢失。
2、支持Value类型更多。
3、多种客户端
4、支持集群来扩展空间
5、开源
1.4. Mysql、Memcached和Redis的比较
存储过期:会员,游戏道具,登录锁定。。。
Memcached和Redis都是key-value类型的Nosql,主要区别在于redis支持的Value类型更多,redis不仅支持内存存储,还支持持久化到磁盘。
1.5. 使用场景
1.5.1. 缓存
经常查询数据,放到读速度很快的空间(内存),以便下次访问减少时间。减轻数据库压力,减少访问时间.而redis就是存放在内存中的。
Hibernte二级缓存(ehcache)
1.5.2. 计数器应用
网站通常需要统计注册用户数,网站总浏览次数等等
新浪微博转发数、点赞数
1.5.3. 实时防攻击系统
暴力破解:使用工具不间断尝试各种密码进行登录。防:ip—>num,到达10次以后自动锁定IP,30分钟后解锁
解决方案:
1、存数据库
登录操作的访问量非常大
2、static Map<String,int> longinFailNumMap;
Map存储空间有限,大批量就不行,并且断电以后数据丢失。
问题:Redis能解决
1、每次查询数据库,查询速度慢,多次写 内存
2、断电会丢失数据,多个节点,不能共用 redis集群,容量可以无限大,可以共享数据、并且支持过期
1.5.4. 排行榜
总积分榜,今日积分榜,周积分,月积分,季度积分
方案:从数据库中查出来计算.
问题:
1、实时查询,查询速度慢
2、还要进行各种计算。
1.5.5. 设定有效期的应用
设定一个数据,到一定的时间失效。 自动解锁,购物券
1.5.6. 自动去重应用
Uniq 操作,获取某段时间所有数据排重值 这个使用 Redis 的 set 数据结构最合适了,只需要不断地将数据往 set 中扔就行了,set 意为 集合,所以会自动排重。
1.5.7. 队列
构建队列系统 使用 list 可以构建队列系统,使用 sorted set 甚至可以构建有优先级的队列系统。
秒杀:可以把名额放到内存队列(redis),内存就能处理高并发访问。限流
1.5.8. 消息订阅系统
Pub/Sub 构建实时消息系统 Redis 的 Pub/Sub 系统可以构建实时的消息系统,比如很多用 Pub/Sub 构建的实时聊天系统 的例子。
比如QQ群消息
1.6. 小结
2. 安装Redis服务端
Redis 的官方下载站是 http://redis.io/download,可以去上面下载最新的安装程序下来
2.1. windows下的安装和使用
1.下载redis程序软件
使用redisbin32 或redisbin64
2.绿色软件,不需要安装,直接使用
3.启动redis服务(带配置文件启动,和不带配置文件启动)
4.连接到redis进行操作
cmd>{%redis%}/redis-cli -h ip地址 -p 端口号
ip 默认为本地 -p 默认6379
redis-cli -h 172.16.6.248 -p 6379
cmd>{%redis%}/redis-cli
5. 基本用法
2.2. Linux下的安装和使用(了解)
1下载redis源码
wget http://download.redis.io/releases/redis-3.0.6.tar.gz 或者使用sftp上传redis-3.0.6.tar.gz
2安装redis
tar xf redis-3.0.6.tar.gz //解压
cd redis-3.0.6
//不需要配置参数 不需要执行./configure
make && make install//编译&&安装
3将redis设置为系统服务
cp (redis源码目录)utils/redis_init_script /etc/init.d/redis
vim /etc/init.d/redis //修改红框处的代码
4修改redis.conf配置文件
mkdir /etc/redis //创建/etc/redis目录
cp redis.conf /etc/redis/redis.conf
vim /etc/redis.conf
//将redis配置文件复制到redis
//设置为守护进程,以后台方式运行
使用service redis start命令启动redis服务.
5 将redis服务设置为开机启动
chkconfig –-add redis
chkconfig –level 35 redis on
3. Redis操作
3.1. 使用redis-cli 客户端操作redis
redis是key-value类型的Nosql,命令能操作key和Value,而对于key就是String,而Value就有很多类型(String,list,set,hash…).
3.1.1. 对value为string类型的常用操作
set key value//将字符串值value关联到key
get key //返回key关联的字符串值
mset //同时设置一个或多个 key-value 对 merge
mget //返回所有(一个或多个)给定 key 的值
incr key //将 key 中储存的数字值增1(key不存在,则初始化为0,再加1)
decr key //将 key 中储存的数字值减1(key不存在,则初始化为0,再减1)
incrBy key num//自增多少
decrBy key num
Setex key seconds value //同时设置key的过期时间和值
3.1.2. 对key的常用操作
keys * //获取所有key列表
del key //删除key
expire key xx //设置key的过期时间(xx秒后过期)
ttl key //查看key的过期时间
flushall //清空整个redis服务器数据,所有的数据库全部清空
flushdb //清除当前库,redis中默认有16个数据库,名称分别为0,1,2.。。15(可以用select index 命令来切换数据库)
3.1.3. 对list集合的常用操作
list集合可以看成是一个左右排列的队列(列表)
lpush key value //将一个或多个值 value 插入到列表 key 的表头(最左边)
rpush key value //将一个或多个值 value 插入到列表 key 的表尾(最右边)
lpop key //移除并返回列表 key 的头(最左边)元素。
rpop key //移除并返回列表 key 的尾(最右边)元素。
lrange key start stop //返回列表 key 中指定区间内的元素,查询所有的stop为-1即可
lrem key count value //根据count值移除列表key中与参数 value 相等的元素count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。count = 0 : 移除表中所有与 value 相等的值。
lindex key index //返回列表 key 中,下标为 index 的元素
ltrim key start stop //对一个列表进行修剪,保留start和stop范围内的值
3.1.4. 对set集合的常用操作
set集合是一个无序的不含重复值的队列
sadd key member //将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略
srem key member //移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略
smembers key //返回集合 key 中的所有成员。
3.1.5. 对SortedSet(有序集合)的操作
3.1.6. 对hash类型的常用操作
hash类型类似于php的数组 java map
hset key name value//添加一个name=>value键值对到key这个hash类型
hget key name //获取hash类型的name键对应的值
hmset key name1 key1 name2 key2 //批量添加name=>value键值对到key这个hash类型
hmget key name1 name2//批量获取hash类型的键对应的值
hkeys //返回哈希表 key 中的所有键
hvals //返回哈希表 key 中的所有值
hgetall //返回哈希表 key 中,所有的键和值
我们将user:1(name:zhangsan,age:18,sex:nv)的信息保存在hash表.
3.1.7. 事务(重要)弱事务) (TCC、消息一致性)
multi //标记一个事务块的开始。
exec //执行所有事务块内的命令。
discard //取消事务,放弃执行事务块内的所有命令。
Redis的事务在执行exec指令时,才批量执行操作,没有回滚操作
3.1.8. 订阅/发布(了解)
SUBSCRIBE channel [channel …] //订阅给定的一个或多个频道的信息。
PUBLISH channel message //将信息 message 发送到指定的频道 channel 。
新开一个客户端订阅tv频道
发布nihao!消息到tv频道
订阅tv频道的客户端可以收到nihao!消息
3.1.9. 设置密码(了解)
- 通过命令动态调整密码
CONFIG SET 命令可以动态地调整 Redis 服务器的配置而无须重启,重启后失效
CONFIG SET requirepass 123456 //将密码设置为123456
CONFIG SET requirepass “” //清除密码
AUTH 123456 //输入密码进行认证 - 通过配置文件设置密码
在配置文件redis.conf中增加一行代码
requirepass 123456
将密码123456设置到配置文件中,redis启动时加载该文件,即可启用密码
4. java操作Redis
原来mysql需要使用jdbc,现在需要redis的一个java客户端jedis。
jedis是客户端,而reids是服务器。使用jedis这个java客户端操作redis数据库。
4.1. Jedis简单操作
4.1.1. 简单配置
使用jedis 客户端,完成jedis简单操作
4.1.2. 连接池配置
通过jedis连接池,简单操作redis数据库
4.2. Jedis数据结构操作
使用jedis来操作redis的key和value,而value有很多种类型,和命令操作一样。
4.2.1. Key操作
4.2.2. String操作
Crud
批量操作
扩展
4.2.3. List操作
4.2.4. Set操作
4.2.5. Hash操作
4.3. Jedis排序
4.4. Jedis事务
5. Redis持久化配置
5.1. 简介
Redis 提供了两种不同级别的持久化方式:RDB和AOF,可以通过修改redis.conf来进行配置.
当满足持久化条件时,会进行持久化保存,还来不及保存的数据,会以aof日志的方式保存下来。
Redis启动时,先解析日志文件(一堆命令),恢复数据。然后还要加载rdb文件(取并集)。
5.2. RDB模式
RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照,默认开启该模式.
如何关闭 rdb 模式:
save “”
save 900 1 //至少在900秒的时间段内至少有一次改变存储同步一次
save xxx
save 60 10000
5.3. AOF追加模式
AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,默认关闭该模式。
如何开启aof模式:
appendonly yes //yes 开启,no 关闭
appendfsync always //每次有新命令时执行一次fsync,就将缓冲区的数据放入aof文件
#这里我们启用 everysec
appendfsync everysec //每秒 fsync 一次
appendfsync no //从不fsync(交给操作系统来处理,可能很久才执行一次fsync)
其它的参数请大家看redis.conf配置文件详解
5.4. 小结
如果满足保存策略,就会把内存的数据保存到数据文件,还来不及保存那部分数据存放到更新日志中。
在加载时,把两个数据做一个并集。
6 Redis高级
6.1. redis集群
为啥要集群,一台服务器内存有限,存放的数据太多不能满足。多台服务器做集群,高并发。
6.2. Redis Spring集成
一般项目总都是有Spring,我们使用jedis访问reids时,所有要jedis被Spring管理。集群原理就是把核心对象交给Spring管理。
Jedis核心对象:配置文件,连接池配置对象,连接池。
集成方式有两种:
Spring data-redis
自己封装(自己封装)
导入jar包
准备配置文件,配置核心对象
加载配置文件
连接池配置对象
连接池对象
管理连接对象
操作crud模板
把配置文件集成Spring–以外部文件的方式进行导入
测试
通过crud模板操作redis
6.3. Redis经典实用场景-缓存
6.3.1. 为什么要使用缓存
把经常查询的数据,很少修改的数据存放到缓存中,减少访问数据库,降低数据库压力并且缓存一般都是内存,访问速度比较快。
6.3.2. 哪些数据适合放到缓存中
经常查询:缓存就是提供数据查询高效访问。
很少修改:修改时要同步修改缓存和数据库
例如:地区数据、商品分类、数据字典 菜单(不考虑权限)
6.3.3. 选择合适的缓存
Hibernate二级缓存,mybatis二级缓存,redis中央缓存
Hibernate二级缓存,mybatis二级缓存默认不支持集群缓存,要使用redis
6.3.4. 怎么存储数据
1) json:把要存放的数据转换为json类型的字符串
保存缓存时:
Java Object----------->json字符串
获取缓存:
json字符串-------->Java Object-
Json框架:jdk-json-lib jackson gson fastjson
2)二进制存放:把要存放的数据序列化为二进制
序列化框架实现
6.3.5. 实现菜单缓存
6.4. 淘汰策略
6.4.1. 为什么要淘汰数据
淘汰一些数据,达到redis数据量都是有效的。选择合适的淘汰策略进行淘汰.怎么淘汰
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
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-enviction(驱逐):禁止驱逐数据(不删除任意数据.默认策略,但redis还会根据引用计数器进行释放),这时如果内存不够时,会直接返回错误)
redis 确定驱逐某个键值对后,会删除这个数据并,并将这个数据变更消息发布到本地(AOF 持久化)和从机(主从连接)。