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 服务节点中使用的 database redis支持服务端锁定吗?_Redis

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的比较

Redis 服务节点中使用的 database redis支持服务端锁定吗?_Redis_02


存储过期:会员,游戏道具,登录锁定。。。

Memcached和Redis都是key-value类型的Nosql,主要区别在于redis支持的Value类型更多,redis不仅支持内存存储,还支持持久化到磁盘。

1.5. 使用场景

1.5.1. 缓存

经常查询数据,放到读速度很快的空间(内存),以便下次访问减少时间。减轻数据库压力,减少访问时间.而redis就是存放在内存中的。
Hibernte二级缓存(ehcache)

1.5.2. 计数器应用

网站通常需要统计注册用户数,网站总浏览次数等等

新浪微博转发数、点赞数

Redis 服务节点中使用的 database redis支持服务端锁定吗?_redis_03

1.5.3. 实时防攻击系统

暴力破解:使用工具不间断尝试各种密码进行登录。防:ip—>num,到达10次以后自动锁定IP,30分钟后解锁

解决方案:

1、存数据库

Redis 服务节点中使用的 database redis支持服务端锁定吗?_redis_04


登录操作的访问量非常大

2、static Map<String,int> longinFailNumMap;

Map存储空间有限,大批量就不行,并且断电以后数据丢失。

问题:Redis能解决

1、每次查询数据库,查询速度慢,多次写 内存

2、断电会丢失数据,多个节点,不能共用 redis集群,容量可以无限大,可以共享数据、并且支持过期

1.5.4. 排行榜

总积分榜,今日积分榜,周积分,月积分,季度积分

方案:从数据库中查出来计算.

Redis 服务节点中使用的 database redis支持服务端锁定吗?_Redis_05


问题:

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.绿色软件,不需要安装,直接使用

Redis 服务节点中使用的 database redis支持服务端锁定吗?_数据_06

3.启动redis服务(带配置文件启动,和不带配置文件启动)

Redis 服务节点中使用的 database redis支持服务端锁定吗?_redis_07

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. 基本用法

Redis 服务节点中使用的 database redis支持服务端锁定吗?_数据_08

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…).

Redis 服务节点中使用的 database redis支持服务端锁定吗?_数据_09


3.1.1. 对value为string类型的常用操作

set key value//将字符串值value关联到key

get key //返回key关联的字符串值

Redis 服务节点中使用的 database redis支持服务端锁定吗?_redis_10


mset //同时设置一个或多个 key-value 对 merge

mget //返回所有(一个或多个)给定 key 的值

Redis 服务节点中使用的 database redis支持服务端锁定吗?_redis_11


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的过期时间和值

Redis 服务节点中使用的 database redis支持服务端锁定吗?_数据_12

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 命令来切换数据库)

Redis 服务节点中使用的 database redis支持服务端锁定吗?_数据_13

3.1.3. 对list集合的常用操作

list集合可以看成是一个左右排列的队列(列表)

lpush key value //将一个或多个值 value 插入到列表 key 的表头(最左边)

rpush key value //将一个或多个值 value 插入到列表 key 的表尾(最右边)

Redis 服务节点中使用的 database redis支持服务端锁定吗?_数据_14


lpop key //移除并返回列表 key 的头(最左边)元素。

rpop key //移除并返回列表 key 的尾(最右边)元素。

Redis 服务节点中使用的 database redis支持服务端锁定吗?_redis_15


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 相等的值。

Redis 服务节点中使用的 database redis支持服务端锁定吗?_Redis_16


lindex key index //返回列表 key 中,下标为 index 的元素

ltrim key start stop //对一个列表进行修剪,保留start和stop范围内的值

Redis 服务节点中使用的 database redis支持服务端锁定吗?_redis_17

3.1.4. 对set集合的常用操作

set集合是一个无序的不含重复值的队列

sadd key member //将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略

srem key member //移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略

smembers key //返回集合 key 中的所有成员。

Redis 服务节点中使用的 database redis支持服务端锁定吗?_Redis_18

3.1.5. 对SortedSet(有序集合)的操作

Redis 服务节点中使用的 database redis支持服务端锁定吗?_数据_19

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表.

Redis 服务节点中使用的 database redis支持服务端锁定吗?_数据_20

3.1.7. 事务(重要)弱事务) (TCC、消息一致性)

multi //标记一个事务块的开始。

exec //执行所有事务块内的命令。

Redis 服务节点中使用的 database redis支持服务端锁定吗?_Redis_21


discard //取消事务,放弃执行事务块内的所有命令。

Redis的事务在执行exec指令时,才批量执行操作,没有回滚操作

3.1.8. 订阅/发布(了解)

SUBSCRIBE channel [channel …] //订阅给定的一个或多个频道的信息。

PUBLISH channel message //将信息 message 发送到指定的频道 channel 。

新开一个客户端订阅tv频道

Redis 服务节点中使用的 database redis支持服务端锁定吗?_redis_22


发布nihao!消息到tv频道

Redis 服务节点中使用的 database redis支持服务端锁定吗?_数据_23


订阅tv频道的客户端可以收到nihao!消息

Redis 服务节点中使用的 database redis支持服务端锁定吗?_redis_24

3.1.9. 设置密码(了解)

  1. 通过命令动态调整密码
    CONFIG SET 命令可以动态地调整 Redis 服务器的配置而无须重启,重启后失效
    CONFIG SET requirepass 123456 //将密码设置为123456
    CONFIG SET requirepass “” //清除密码
    AUTH 123456 //输入密码进行认证
  2. 通过配置文件设置密码
    在配置文件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简单操作

Redis 服务节点中使用的 database redis支持服务端锁定吗?_Redis_25

Redis 服务节点中使用的 database redis支持服务端锁定吗?_redis_26

4.1.2. 连接池配置

通过jedis连接池,简单操作redis数据库

Redis 服务节点中使用的 database redis支持服务端锁定吗?_数据_27

4.2. Jedis数据结构操作

使用jedis来操作redis的key和value,而value有很多种类型,和命令操作一样。

4.2.1. Key操作

Redis 服务节点中使用的 database redis支持服务端锁定吗?_数据_28

4.2.2. String操作

Crud

Redis 服务节点中使用的 database redis支持服务端锁定吗?_Redis_29


批量操作

扩展

4.2.3. List操作

Redis 服务节点中使用的 database redis支持服务端锁定吗?_Redis_30

4.2.4. Set操作

Redis 服务节点中使用的 database redis支持服务端锁定吗?_数据_31

4.2.5. Hash操作

Redis 服务节点中使用的 database redis支持服务端锁定吗?_数据_32

4.3. Jedis排序

Redis 服务节点中使用的 database redis支持服务端锁定吗?_数据_33

Redis 服务节点中使用的 database redis支持服务端锁定吗?_redis_34

4.4. Jedis事务

Redis 服务节点中使用的 database redis支持服务端锁定吗?_redis_35


Redis 服务节点中使用的 database redis支持服务端锁定吗?_数据_36

5. Redis持久化配置

5.1. 简介

Redis 服务节点中使用的 database redis支持服务端锁定吗?_Redis_37

Redis 提供了两种不同级别的持久化方式:RDB和AOF,可以通过修改redis.conf来进行配置.

Redis 服务节点中使用的 database redis支持服务端锁定吗?_redis_38

当满足持久化条件时,会进行持久化保存,还来不及保存的数据,会以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集群

为啥要集群,一台服务器内存有限,存放的数据太多不能满足。多台服务器做集群,高并发。

Redis 服务节点中使用的 database redis支持服务端锁定吗?_Redis_39

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

Redis 服务节点中使用的 database redis支持服务端锁定吗?_Redis_40

2)二进制存放:把要存放的数据序列化为二进制
序列化框架实现

6.3.5. 实现菜单缓存

Redis 服务节点中使用的 database redis支持服务端锁定吗?_数据_41


Redis 服务节点中使用的 database redis支持服务端锁定吗?_数据_42


Redis 服务节点中使用的 database redis支持服务端锁定吗?_Redis_43

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 持久化)和从机(主从连接)。