一、Redis简介
Redis是一个高性能(NoSQL)的、开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、key-value数据库,提供多种语言的API
什么是NoSQL: 即Not-only SQL,NoSQL表示非关系型数据库
为什么要使用NoSQL: 传统的关系型数据库在应对超大规模和高并发的SNS类型的web2.0纯动态网站上存在很多问题,包括高并发数据读写、对海量数据高效率存储和访问、对数据库的高扩展性和高可用性需求。NoSQL的产生就是为了解决大规模数据集合多种数据类型的带来的问题。
NoSQL数据库包括键值存储数据库、列存储数据库、文档型数据库、图形数据库等
Redis的优点:
- 性能极高
- 丰富的数据类型,支持String、Hash、List、Set等数据类型
- 原子性:Redis的所有操作都是原子性的,即Redis的操作要么执行完成要么不执行
- 丰富的特性
- 高速读写
Redis缺点:
- 持久化问题,Redis直接将数据存储到内存中,实现数据的持久化将数据写入磁盘代价代价高昂
- 占用内存过高
Redis使用场景: 可用作数据库、缓存、热点数据(经常会被查询但是不经常修改或删除的数据)和消息中间件等
基本用法: set key value命令存值,get key命令取值
二、redis的基本配置
通过redis.conf文件配置redis:
1、redis默认不以守护进程的方式运行,将daemonize no修改为daemonize yes
(守护进程是一个在后台运行且不收任何终端控制的进程)
2、当redis一守护进程方式运行时,redis会默认将pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis.pid
3、通过port属性修改端口
4、通过bind属性修改绑定主机地址
5、通过timeout属性指定客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能 timeout 300
6、通过loglevel指定日志记录级别,redis共支持四个级别:debug、verbose、notice、warning,默认为verbose
loglevel verbose
7、通过logfile指定日志记录方式
8、通过databases属性设置数据库的数量,默认16个数据库,默认数据库id为0,可以使用SELECT 在连接上指定数据库id
9、通过save属性指定持久化操作频率,即指定在多长时间内有多少次将数据同步到磁盘的更新操作,redis中默认提供了三个条件:
save 900 1
save 300 10
save 60 10000
意思分别是:900秒内有一个更改,300秒内有10个更改,60秒内有10000个更改
10、通过rdbcompression属性指定存储至本地数据库时是否压缩数据,默认为yes,redis默认采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变大
rdbcompression yes
11、通过dbfilename指定本地数据库文件名,默认为dump.rdb
12、通过dir属性指定本地数据库存放目录,默认为当前目录./
13、通过requirepass属性设置连接密码,若设置了密码,客户端在连接时需要听过AUTH 命令提供密码,默认关闭该功能
14、通过maxclients属性设置同一时间最大客户端连接数,默认为0即不作限制,若客户端连接数达到限制,redis会关闭新的连接并向客户端返回max number of client reached
15、通过maxmemory属性指定redis最大内存限制,达到最大内存后redis会尝试清楚已到期或即将到期的key,若仍然达到最大内存限制,将无法再进行写入,但仍然会进行读取操作
三、内存维护策略
redis将数据存在内存中,时常会存储大量的数据,为了避免占用过多内存资源,导致服务器宕机,redis提供了两种内存维护策略
1、为数据设置超时时间
通过expire key time命令设置数据的过期时间,其中time是以秒为单位的,例如我们对一个数据k1 123设置过期时间为20,过几秒后通过ttl命令查看k1,其只剩15秒的生存时间
字符串键值也可以使用setex(String key,int seconds,String value)命令设置过期时间
若设置了过期时间后又想让缓存永久不过期,可以使用persist key命令(-1表示永久有效)
2、采用LRU算法动态将不用的数据删除
LRU即Least Recent Used,即最久未被使用,是一种页面置换算法,基于最近使用的数据会在未来一段时间内仍然被使用,而已经很久没有使用的页面可能在未来较长的时间内仍然不会被使用这一思想,对于在内存中但不用的数据块,操作系统会将其移除内存而腾出空间来加载另外的数据。
redis.conf文件中有关内存维护策略的配置:
volatile-lru:在设定了过期时间的数据中,删除最不常用的数据
allkeys-lru:查询所有的key中最近最不常用的数据进行删除,这是最广泛的应用
volatile-random:在已经设定了过期时间的数据中随机删除
allkeys-random:查询所有的key之后随机删除
volatile-ttl:查询所有设定了过期时间的数据并排序,将马上要过期的数据进行删除
noeviction:如果设置为该属性,则不会进行删除操作,若内存溢出则报错返回
volatile-lfu:从所有设置了过期时间的键中删除使用频率最少的键
allkeys-lfu:从所有的键中删除使用频率最少的键