redis笔记

2019/12/11 redis 共 9007 字,约 26 分钟

Redis

一、Redis安装及入门介绍

1、Redis简介

1.1 redis介绍

Redis 是完全开源免费的,遵守BSD协议,是一个高性能(NOSQL)的key-value数据库,Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。(Vmware在资助着redis项目的开发和维护)

1.2 NOSQL介绍

NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题

1.2.1 NoSQL数据库的四大分类

1. 键值(Key-Value)存储数据库

这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。[3] 举例如:Tokyo Cabinet/Tyrant, Redis,Voldemort, Oracle BDB.

2.列存储数据库

这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak.

3.文档型数据库

文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可 以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,已经开源。

4.图形(Graph)数据库

图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。[2] 如:Neo4J, InfoGrid, Infinite Graph.

NoSQL数据库在以下的这几种情况下比较适用:1、数据模型比较简单;2、需要灵活性更强的IT系统;3、对数据库性能要求较高;4、不需要高度的数据一致性;5、对于给定key,比较容易映射复杂值的环境。

1.3redis特点

性能极高-Redis读取的速度是110000次/s,写的速度是81000次/秒。

丰富的操作类型-Redis支持的类型 String, List, Hash, Set 及 Ordered Set 数据类型操作。

原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。

丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

Redis是一个简单的,高效的,分布式的,基于内存的缓存工具。架设好服务器后,通过网络连接(类似数据库),提供Key-Value式缓存服务。简单,是Redis突出的特色。 简单可以保证核心功能的稳定和优异。

1.4 Redis总结

redis单个key 存入512M大小

redis支持多种类型的数据结构(string,list,hash.set.zset)

redis 是单线程 原子性

redis可以持久化 因为使用了 RDB和AOF机制

redis支持集群 而且redis 支持库(0-15) 16个库

redis 还可以做消息队列 比如聊天室 IM

企业级开发中:可以用作数据库、缓存(热点数据(经常会被查询,但是不经常被修改或者删除的数据)和消息中间件等大部分功能。

优点:

  1. 丰富的数据结构

  2. 高速读写,redis使用自己实现的分离器,代码量很短,没有使用lock(MySQL),因此效率非常高。

缺点:

  1. 持久化。Redis直接将数据存储到内存中,要将数据保存到磁盘上,Redis可以使用两种方式实现持久化过程。定时快照(snapshot):每隔一段时间将整个数据库写到磁盘上,每次均是写全部数据,代价非常高。第二种方式基于语句追加(aof):只追踪变化的数据,但是追加的log可能过大,同时所有的操作均重新执行一遍,回复速度慢。
  2. 耗内存,占用内存过高。

2、Redis安装

2.1 windows安装

参考地址

2.2 linux安装

官方网站:http://redis.io/

官方下载:http://redis.io/download 可以根据需要下载不同版本

还可以直接在 linux执行 wget http://download.redis.io/releases/redis-4.0.1.tar.gz 下载安装包

2.2.1 解压安装包

将下载的安装包上传至服务器 /opt/目录下

执行解压命令tar -zxvf redis-4.0.14.tar.gz

1576140659530

2.2.2 编译安装文件

进入解压后的目录进行编译。

1576140817457

编译失败

1576140883752

由于redis是由C语言开发的,需要将下载的源码包进行编译,编译需要gcc环境。如果没有gcc环境的话需要现在服务器上安装gcc环境。

gcc的安装很简单,首先要确保root登录,其次就是Linux要能连外网:

yum -y install gcc automake autoconf libtool make

注意:运行yum时出现/var/run/yum.pid已被锁定,PID为xxxx的另一个程序正在运行的问题解决

rm -f /var/run/yum.pid

1576141203440

重新make。注意:需要先执行 make distclean 清除上一次的残余文件,否则会报错。

执行成功

1576141675193

2.2.3进行安装操作

执行安装命令 make PREFIX=/usr/local/redis install

(安装编译后的文件) 安装到指目录:

注意:PREFIX必须大写、同时会自动为我们创建redis目录,并将结果安装此目录

1576141900590

usr/local/redis 目录已经被创建,其中存在bin目录。

至此redis的安装就成功了。

3、启动redis服务

3.1 启动服务

在bin目录下直接执行 redis-server 即可完成redis的启动

1576142154848

3.2 连接测试

重新打开一个ssh窗口,进入bin目录执行 redis-cli命令即可连接上redis,输入ping,返回pong。表示已经连接成功。

1576142290617

redis-cli –h IP地址 –p 端口

默认连接 本地ip 和6379端口

4、redis配置

Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf

4.1准备配置文件

将解压包下的redis.conf 复制到/usr/local/redis下作为配置文件

1576142646872

4.2 配置文件详解

redis.conf 配置项说明如下:

1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
    daemonize no
2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
    pidfile /var/run/redis.pid
3. 指定Redis监听端口,默认端口为6379,为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
    port 6379
4. 绑定的主机地址 一般将此配置删除。
    bind 127.0.0.1
5.当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
    timeout 300
6. 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
    loglevel verbose
7. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
    logfile stdout
8. 设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id
    databases 16
9. 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
    save <seconds<changes>
    Redis默认配置文件中提供了三个条件:
    save 900 1
    save 300 10
    save 60 10000
    分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
 
10. 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
    rdbcompression yes
11. 指定本地数据库文件名,默认值为dump.rdb
    dbfilename dump.rdb
12. 指定本地数据库存放目录
    dir ./
13. 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
    slaveof <masterip<masterport>
14. 当master服务设置了密码保护时,slav服务连接master的密码
    masterauth <master-password>
15. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
    requirepass foobared
16. 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
    maxclients 128
17. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
    maxmemory <bytes>
18. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
    appendonly no
19. 指定更新日志文件名,默认为appendonly.aof
     appendfilename appendonly.aof
20. 指定更新日志条件,共有3个可选值: 
    no:表示等操作系统进行数据缓存同步到磁盘(快) 
    always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) 
    everysec:表示每秒同步一次(折中,默认值)
    appendfsync everysec
 
21. 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
     vm-enabled no
22. 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
     vm-swap-file /tmp/redis.swap
23. 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
     vm-max-memory 0
24. Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值
     vm-page-size 32
25. 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。
     vm-pages 134217728
26. 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
     vm-max-threads 4
27. 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
    glueoutputbuf yes
28. 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
    hash-max-zipmap-entries 64
    hash-max-zipmap-value 512
29. 指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)
    activerehashing yes
30. 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
    include /path/to/local.conf

Redis中的内存维护策略

redis作为优秀的中间缓存件,时常会存储大量的数据,即使采取了集群部署来动态扩容,也应该即时的整理内存,维持系统性能。

在redis中有两种解决方案,

一是为数据设置超时时间,

二是采用LRU算法动态将不用的数据删除。内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,操作系统会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。

  1. volatile-lru:设定超时时间的数据中,删除最不常使用的数据.

  2. allkeys-lru:查询所有的key中最近最不常使用的数据进行删除,这是应用最广泛的策略.

  3. volatile-random:在已经设定了超时的数据中随机删除.

  4. allkeys-random:查询所有的key,之后随机删除**.

  5. volatile-ttl:查询全部设定超时时间的数据,之后排序,将马上将要过期的数据进行删除操作.

  6. noeviction:如果设置为该属性,则不会进行删除操作,如果内存溢出则报错返回. 默认的策略。

  7. volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键

  8. allkeys-lfu:从所有键中驱逐使用频率最少的键

4.3自定义配置

进入对应的安装目录 /usr/local/redis

修改 redis.conf 配置文件 vim redis.conf (进入命令模式 通过/内容 查找相应字符串)

Redis配置默认必须修改:

daemonize no 修改为 daemonize yes 后台启动

bind 127.0.01 注释掉 绑定到本地,只能127.0.0.1登录

requirepass 设置密码 4.0版本以后必须带密码

4.4使用自定义配置启动redis

启动服务:redis-server ./redis.conf

客户端连接:redis-cli -a 密码

远程连接: redis-cli –h IP地址 –p 端口–a 密码

5、Redis关闭

第一种关闭方式:(断电、非正常关闭。容易数据丢失)

查询PID ps -efgrep -i redis

kill -9 PID

第二种关闭方式(正常关闭、数据保存)

./bin/redis-cli shutdown 关闭redis服务,通过客户端进行shutdown

如果redis设置了密码,需要先在客户端通过密码登录,再进行shutdown即可关闭服务端

二、Redis数据结构及基础命令

1、基础命令

redis命令用于在redis服务上对数据进行操作。

数据是以k-v键值对的形式进行存储的,其中key是字符串形式,v有5种类型。

redis支持5种数据类型(不仅仅),string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)。每种数据类型拥有各自的操作命令。

1.1Redis通用key命令

del key 删除key 用于在key存在时对key进行删除。

exists key 判断key是否存在。

expire key seconds 给key设置过期时间(以秒为单位)。

pexpire key milliseconds 给key设置过期时间(以毫秒为单位)。

ttl key 返回剩余过期时间,以秒为单位。

pttl key 返回剩余过期时间,以毫秒为单位。

persist key 设置有过期时间的key为永久的。

keys pattern 查找给定模式(pattern)的key。

​ 通配符: * 代表所有。 如 keys * 查询所有。 keys user:* 查询以user:开头的所有。

​ ?代表一个字符。如 keys u?ser。

​ []任意匹配一个。如 keys u[sa]er。 查询 user和uaer。

rename key newkey 将key的名称变更为newkey。如果newkey已经存在,则会将原有的覆盖。

renamenx key newkey 将key的名称变更为newkey,如果newkey已经存在,则变更失败。

sort key 排序命令,对key所对应的value进行排序并返回。只能对 list、set、zset进行操作。排序时可添加额外参数实现逆向排序,分页等操作。可通过help sort 查看详细命令。

move key db 将key移入给定的db种。

type key 查询key对应值的类型。

1.2 Redis数据库命令

redis的key是程序员定义的,在使用过程中会出现大量的数据以及对应的key,极易出现重复或冲突。

redis为每各服务提供了16个数据库,分别以0-15来命名。可以通过不同的数据库来缓解key值可能重复的问题。

select index 选择数据库 index可以填写0-15

dbsize 查看数据库中有多少数据

flaushdb 清除数据库中的内容(慎用)

flaushall 清除整个redis服务中的数据(慎用)

1.3 key值的命名

redis单个key 存入512M大小

  1. key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率;
  2. key也不要太短,太短的话,key的可读性会降低;
  3. 在一个项目中,key最好使用统一的命名模式,例如user:123:password;
  4. key名称区分大小写;

2、 数据类型

redis 自身是一个Map,其中所有的数据都是采用key : value 的形式存储,数据类型指的是存储的数据的类型,也就是value 部分的类型,key 部分永远都是字符串。redis最基本的功能就是作为缓存使用,它是单线程的,因而随着业务的复杂它还可以实现许多强大的功能。其他功能的实现就需要依赖redis的数据结构,不同的数据结构可以实现拥有各自特性的功能。

2.1 string

2.1.1 简介

string是redis最基本的类型,一个key对应一个value。string类型是二进制安全的,意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。string类型是Redis最基本的数据类型,一个键最大能存储512MB。

二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改、破译等,如果被攻击,能够及时检测出来

存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型 存储数据的格式:一个存储空间保存一个数据 存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用

2.2.1 string命令

set key value

命令用于设置给定 key 的值。如果 key 已经存储值, SET 就覆写旧值,且无视类型

setnx key value

当key不存在则会为key设置值,setnx(SET if Not eXists),如果key值存在,则设置值失败,返回值为0。根据这个特性,我们可以利用这个命令来实现分布式锁。

setex key second value

设置key值得同时给定有效时间,有效时间到期后key失效。这个可以用来完成一些时效性的操作。

mset key1 value1 [key2 value2 ...]

可以同时设置多个key :value对。它与set命令对比可以在一次传输中存储多个数据,而set命令需要进行多次传输来进行存储,相对较为费时。

append key value

追加信息到对应的value后,如果key值存在则追加,不存在则新建。

get key

获取对应key的值。如果 key 不存在,返回 nil 。如果key 储存的值不是字符串类型,返回一个错误。

getrange key start end

用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内) ,如果start的值已经超出字符串的总长度,则返回 “”。

mget key1 [key2 key3 ...]

一次获取多个key值。

del key

删除指定的key,如果删除成功则返回数字1,失败返回数字0。

incr key

incr 命令将 key 中储存的数字值增1。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。如果key值存在但存储的不是integer类型的值,则会报错。

incrby key 增量

与incr命令

文档信息

Search

    Table of Contents