目录
一、redis介绍
1、redis为什么会出现
redis的出现主要从两个点来考虑:高性能和高并发。
(1)高性能
在web应用中,会存在很多的数据,而这些数据是存储在数据库中的。用户经由前端页面进行操作时,需要读取数据库中的数据。例如前面文章里介绍的shiro,用户在页面操作时,如果每次我们都要从数据库中获取权限字符串然后比对权限,这样的就会使系统性能降低。因此,对于一些变化不大或不做变动的数据,在第一次读取以后,直接存储到缓存中,这样在以后的操作中直接从缓存中读取即可,从而提高系统的性能。
(2)高并发
对于直接操作缓存来讲,其所能承受的请求数量是大于访问数据库的,因此,可以将数据库中的部分数据转移到缓存中,这样就可以直接到缓存而不经过数据库。
2、redis介绍
Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库、缓存和消息代理。它支持诸如字符串、散列、列表、集合、有序集合等数据结构。与传统数据库不同的是 redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向。
3、redis特性
- 性能极高:Redis读的速度是11W次/s,写的速度是81K次/s
- 支持数据的持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- 丰富的数据类型:Redis不仅仅支持简单的key-value类型的数据,同时还提供Strings, Lists, Hashes, Sets 及 Ordered Sets 等数据结构的存储。
- 支持数据的备份:即master-slave模式的数据备份。
4、redis的线程模型
redis 内部使用文件事件处理器 file event handler,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器进行处理。
文件事件处理器的结构包含 4 个部分:
- 多个 socket
- IO 多路复用程序
- 文件事件分派器
- 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)
多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。
5、redis和其他方式的对比
(1)为什么使用redis,而不使用map/guava做缓存
缓存分为本地缓存和分布式缓存。对于Java而言,如果使用自带的map或者guava,实际上是本地缓存,其主要特点是轻量快速,其生命周期随JVM的销毁而结束,而在多实例的情况下,每个实例都需保存各自的缓存,缓存不具有一致性。
使用redis或者memcached之类则是分布式缓存,在多实例下共用一份缓存数据,但其缺点是需要保持redis和memcached服务的高可用,在整个程序架构上是比较复杂的。
(2)redis和memcached的区别
- redis支持更丰富的数据类型(支持更复杂的应用场景):Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。memcache支持简单的数据类型,String。
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而Memecache把数据全部存在内存之中。
- 集群模式:memcached没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是 redis 目前是原生支持 cluster 模式的.
- Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的多路 IO 复用模型。
对比参数 | redis | memcached |
---|---|---|
类型 | 支持内存、非关系型数据库 | 支持内存、key-value键值对形式 |
数据存储类型 | String、List、Set、Hash、ZSet | 文本型、二进制类型 |
查询类型 | 批量操作、事务支持、每个类型不同的CRUD | CRUD、少量的其他命令 |
附加功能 | 发布/订阅模式、主从分区、序列化支持、脚本支持(Lua脚本) | 多线程服务支持 |
网络IO模型 | 单进程模式 | 多线程、非阻塞IO模式 |
事件库 | 自封装简易事件库AeEvent | 贵族血统的LibEvent事件库 |
持久化支持 | RDB、AOF | 不支持 |
5、redis的使用场景
- 最新N个数据:通过list实现按自然时间排序的数据
- 排行榜,TOP N:利用zset(有序集合)
- 时效性的数据,比如手机验证码:Expire(过期)
- 计数器,秒杀:原子性,自增方法incr、decr
- 去除大量数据中的重复数据:利用set集合
- 构建队列:利用list集合
- 发布订阅消息系统:pub/sub模式
二、redis安装
1、apt安装
Ubuntu下redis的安装:sudo apt-get install redis-server
安装测试:
2、wget 安装
(1)获取redis资源
wget http://download.redis.io/releases/redis-4.0.8.tar.gz
(2)解压
tar -zxvf redis-4.0.8.tar.gz
(3)安装
cd redis-4.0.8
make
cd src
make install PREFIX=/usr/local/redis
(4)移动配置文件到安装目录下
cd /usr/local
mkdir -p /usr/local/redis/bin
mkdir -p /usr/local/redis/etc
cd /usr/local/redis-4.0.2
mv ./redis.conf /usr/local/redis/etc
(5)配置redis为后台启动
vi /usr/local/redis/etc/redis.conf //将daemonize no 改成daemonize yes
(6)开启redis desktop manager远程连接的配置
将第70行的bind注释,第90行将protected-mode改为no
(7)取消注释,设置密码
测试:
启动redis-server
启动redis-cli