redis简介
简介
- redis是一个完全开源的,遵守BSD协议的,高性能的key-value数据库。
特点
- redis支持数据持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载使用。
- rdis不仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- redis支持数据的备份,即master-slave模式的数据备份。
优势
- 性能高:redis的读速度是每秒11万次,写速度是每秒8.1万次。
- 丰富的数据类型:redis支持string,list,hash,set,zset数据类型操作。
- 原子:redis的所有操作都是原子性的,同时redis还支持对几个操作合并后的原子操作。
- 丰富的特性:redis还支持publish,subscribe、通知、key过期等特性。
redis与其他key-value数据库的区别
- redis有着更为复杂的数据结构并且提供对他们的原子性操作。
- redis数据库的数据类型都是基于基本数据结构且对程序员透明,不需要进行额外的抽象。
- redis运行在内存中但是可以永久化到磁盘,所以在对不同数据集进行高速读写使用的时候需要考虑权衡内存大小,数据量不能大于硬件内存。
- redis相比磁盘上相同的复杂的数据结构,在内存中操作起来更加简单方便。
- redis在永久化磁盘时是紧凑的以追加方式存储的,因为他们并不需要进行随机访问永久化数据。
redis的安装
windows
-
下载地址:https://github.com/dmajkic/redis/downloads
-
下载到的redis支持32位和64位,一般是64位。将其copy到你想自定义的磁盘路径位置。如:C:\redis
-
打开cmd窗口并切换到redis目录下执行redis-server.exe redis.conf 命令。
-
可以将redis路径加入环境变量,后续就不需要切换目录可以直接打卡redis服务,湖面的redis.config也可以省略,省略以后会启用默认的配置文件。
-
运行命令以后就会出现以下界面,这个就是redis服务。
-
-
在开启redis服务的前提下(上面cmd窗口不关闭),重新开启一个cmd窗口,继续切换到redis目录下执行访问服务端的命令redis-cli.exe -h 127.0.0.1 -p 6379 。就可以操作redis了。如下界面:
-
linux
-
下载地址:http://www.redis.net.cn/download/(可以下载最新文档版本)
-
下载并安装
# 下载压缩包
$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz
# 解压压缩包
$ tar xzf redis-2.8.17.tar.gz
# 进入redis目录下
$ cd redis-2.8.17
# 编译安装
$ make
-
make编译后,目录下会出现redis的服务程序redis-server和redis的客户端redis-cli
-
首先,先启动redis服务
# 启动服务(使用默认配置)
$ ./redis-server
# 启动服务(使用指定配置)
$ ./redis-server redis.conf
-
注:redis.conf是默认配置,我们可以根据自己的需求使用自己的配置文件。
-
启动服务以后就可以使用客户端就行redis操作
# 打开客户端
$ ./redis-cli
# 进行操作
redis> set a aaa
OK
redis> get a
"aaa"
redis> type a
String
ubuntu下安装
redis配置
-
redis的配置文件位于redis目录下,文件名为redis.conf。
-
我们可以直接打开查看和编辑配置文件,亦可以通过命令config来查看和设置配置项。
-
语法格式:
redis 127.0.0.1:6379> config get config_setting_name
-
示例:
redis 127.0.0.1:6379> config get loglevel
1) "loglevel"
2) "notice"
# 可以使用*获取所有配置项
redis 127.0.0.1:6379>config get *
# 指定本地数据库文件名,默认为dump.rdb
1) "dbfilename"
2) "dump.rdb"
# 设置redis连接密码,如果配置了密码,客户端连接redis时需要通过AUTH <password>命令提供密码,默认为空(关闭)
3) "requirepass"
4) ""
# 当master服务设置了密码保护时,slav服务连接master的密码
5) "masterauth"
6) ""
# 当redis客户端和服务端在同一服务器,可以配置该参数,通过将应用层数据从一个进程拷贝到另一个进程来操作redis数据库。
7) "unixsocket"
8) ""
# 日志记录方式,默认为标准输出,如果配置redis为守护进程方式运行,而且这里又配置日志记录方式为标准输出,
# 则日志将发送给/dev/null
9) "logfile"
10) ""
# 当redis以守护进程方式运行时,redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定。
11) "pidfile"
12) "/var/run/redis.pid"
# 指定redis最大内存限制,redis在启动时会把数据加载到内存中,达到最大内存后,redis会先尝试清除已到期或
# 即将到期的key,当该方法处理后,仍达到最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。
# redis新的vm机制,会把key存放在内存中,value会保存在swap区。
13) "maxmemory"
14) "0"
# redis为了维护性能,会使用类似LRU或者LFU的算法。也就是说,算法选择被淘汰记录时,不会遍历所有记录,
# 而是以随机采样的方式进行淘汰。maxmemory-samples就是控制该过程的采样数量,增大该值会增加CPU的开销,
# 但更接近实际的LRU和LFU的算法。
# LRU算法:最近最少使用算法,从所有的键中选择空转时间最长的键值对清除。
# LFU算法:最近最少使用算法,从所有的键中选择某段时间之内使用频次最少的键值对清除。
15) "maxmemory-samples"
16) "5"
# 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
17) "timeout"
18) "0"
# 定时向客户端发送保活探测报文,单位是秒,如果指定为0,表示关闭该功能。
19) "tcp-keepalive"
20) "0"
# 在redis执行aof持久化时,因为有重复命令,所有会有重写操作。该参数意思是当前aof文件大小和最后一次重写后的
# 大小之间的比率等于或者等于指定的增长百分比,如100代码当前的AOF文件是上次重写的两倍时才重写。重写会将整个
# 内存重新写入aof文件中,以反映最新的状态,这样就避免了,aof文件过大而实际内存小的问题(频繁修改数据的问题)
21) "auto-aof-rewrite-percentage"
22) "100"
# AOF文件重写最小大小,只当AOF文件大小小于该值的时候才可能重写。一般只有在redis服务开启最开始才触发,后续的
# 每次重写就不会根据该变量了(根据的是上一次重写完成后的大小),此变量仅在redis初始化的时候有效,如果redis
# 是恢复时,则lastsize等于初始的aof文件大小。
23) "auto-aof-rewrite-min-size"
24) "67108864"
# 当我们为某个key在redis中第一次执行hset key field value命令的时候,redis会创建一个hash结构,而这个新的
# hash底层其实就是ziplist。当每次执行hset key field value命令时,他就会将field和value作为两个数据项插入
# ziplist中。当随着数据的插入,hash的数据项(key-value键值对)超过该参数指定的512个,也就是ziplist的数据
# 项超过1024的时候,ziplist会转成dict。
25) "hash-max-ziplist-entries"
26) "512"
# 当hash中插入的任意一个value的长度超过64的时候,也就是ziplist的任意一个数据项长度超过64的时候,ziplist
# 会转成dict。
27) "hash-max-ziplist-value"
28) "64"
# 当我们为某个key在redis中第一次执行rpush key value命令的时候,redis会创建一个list结构,而这个新的list
# 底层其实是ziplist。当每次执行rpush key value命令时,他就会将value作为数据项插入ziplist中。当随着数据
# 的插入,list的数据项超过该参数指定的512个,也就是ziplist中的数据项超过512个时,ziplist就会转成linkedlist。
29) "list-max-ziplist-entries"
30) "512"
# 当list中插入的任意一个value的长度超过64的时候,也就是ziplist的任意一个数据项长度超过64的时候,ziplist会
# 转成linkedlist。
31) "list-max-ziplist-value"
32) "64"
# 当我们为某个key在redis中第一次执行sadd key value命令的时候,redis会创建一个set结构,而这个新的set底层
# 其实是intset。当每次执行sadd key value命令时,他就会将value进行去重并作为数据项差插入intset中。当随着
# 数据的插入,set的数据项超过该参数指定的512个,也就是intset中的数据项超过512个时,intset就会转成dict。
33) "set-max-intset-entries"
34) "512"
# 当我们为某个key在redis中第一次执行zadd key score value命令的时候,redis会创建一个zset结构,而这个新的
# zset底层其实是ziplist。当每次执行zadd key score value命令时,他就会将score和value进行去重以及根据分数
# 和大小进行排序插入到ziplist中。当随着数据的插入,zset的数据项超过该参数指定的128个,也就是ziplist中的数
# 据项超过256个时,ziplist会转成skiplist。
35) "zset-max-ziplist-entries"
36) "128"
# 当zset中插入的任意一个value的长度超过64的时候,也就是ziplist的任意一个数据项长度超过64的时候,ziplist会
# 转成skiplist。
37) "zset-max-ziplist-value"
38) "64"
# HyperLogLog是用来做基数(不重复元素)统计的,相对集合统计基数时,元素越多耗费内存越大相比较来讲,该算法所需
# 的空间总是固定且很小的(最大12kb多一点)。但是因为该算法只统计基数个数,不存储元素本身,所以不能像集合那样
# 返回各个元素。在使用该数据结构算法时,底层的数据结构是16384个寄存器(桶,每个桶大小是6b)。刚开始因为放入
# HyperLogLog数据结构的数据少,很多桶都是零值。于是便使用稀疏存储结构来存储。随着放入的数据元素变多,非零的
# 桶也越来越多,整个数据结构存储的数据也越来越多。当稀疏存储占用的总字节数超过该参数指定的3000个字节时,
# 就会转换成密集存储结构。(除此之外,因为6字节的桶中其中一个字节表示值,一个字节也就是8位二进制数字,其中
# 第一位是标志位,最后两位是桶数,所以实际表示值的位数只有五位,最大就是32。所以只要任意一个寄存器的值从32
# 变成33,稀疏存储结构也会直接转换成密集存储结构进行多个桶连续存储)
39) "hll-sparse-max-bytes"
40) "3000"
# redis在执行命令时单线程的,所以为了防止redis执行客户端的lua脚本时间过长而导致无法继续提供服务,redis提供了
# 该参数限制脚本的最长运行时间(单位是毫秒)。当脚本运行时间超过这一限制后,redis将开始接收其他命令但不执行
# (为了确保脚本的原子性),而是直接返回"BUSY"错误。可以通过script kill命令来结束脚本,但是如果该脚本涉及
# 修改操作,该命令是不能终止脚本的。如果遇到这种情况,就只能用shutdown nosave命令来强制终止redis。
# (shutdown nosave和shutdown的区别在于前者不能进行持久化操作,意味着发生在上一次快照后的数据库修改都会丢失)
41) "lua-time-limit"
42) "5000"
# slowlog是redis用于记录慢查询执行时间的日志系统。该参数是为slowlog划定界限的,只有query执行时间大于该参数
# 指定的10000(单位微秒)也就是10毫秒才会被判定为慢查询,被slowlog记录。
43) "slowlog-log-slower-than"
44) "10000"
# 延迟监控是redis用来帮助用户检查和排除可能的延迟问题的特性。启动延迟监控的第一步就是以毫秒为单位设定延迟阈值
# (运行时间超过该阈值的事件将会被延迟监控记录)。如果设定为0,表示不开启延迟监控。
45) "latency-monitor-threshold"
46) "0"
# 该参数表示慢查询日志(slowlog)记录的最大条数,当记录条数超过最大值后,就会将最早的slowlog删除,是个FIFO队列
# (先进先出队列)。
47) "slowlog-max-len"
48) "128"
# 指定redis的监听端口,默认端口是6379。
49) "port"
50) "6379"
# 该参数是用于在Linux系统中控制tcp三次握手(已完成连接队列)的长度。在高并发系统中,需要设置一个较大的值来避免
# 客户端连接速度慢的问题。
# 需要注意的是已完成连接队列的长度也与操作系统中的somaxconn有关,二者取最小(max(tcp-backlog,somaxconn))。
51) "tcp-backlog"
52) "511"
# 设计数据库的数量,默认数据库为0,可以使用select <dbid>命令来连接指定数据库id。
53) "databases"
54) "16"
# 主从响应策略,slave会每隔该参数指定的时间(单位 秒)来ping一次master,也就是所谓的心跳间隔。
55) "repl-ping-slave-period"
56) "10"
# 主从响应策略,在slave ping master的前提下,slave超过该参数指定时间(单位 秒)内未收到master的响应,就会
# 认为master挂了(如果master没有挂掉但是阻塞了也会出现这种情况),就会操作更新新的master。
57) "repl-timeout"
58) "60"
# 主从redis连接时,主实例会把同步数据和写命令同步给从实例。于是就有了环形缓冲区(复复制积压缓存区),环形
# 缓存区的目的就是分别记录主库的写位置以及从库的读位置。当中途断开后,因为缓存区是环形的,所以从库读取速度慢
# 会导致主库写记录覆盖从库未读取的记录,导致数据未全部同步,造成数据缺失。该参数就是设定环形缓存区的大小。
59) "repl-backlog-size"
60) "1048576"
# 在主从复制的时候,如果slave全部断掉了,且在指定的时间内没有重新连接上,则backlog(缓冲区)就会被master
# 删除掉。该参数就是设置backlog过期时间的(单位 秒),如果设置为0,则永不清除。
61) "repl-backlog-ttl"
62) "3600"
# 设置同一时间最大客户端连接数,如果设置为0,则表示不限制。当客户端连接数达到限制时,redis会关闭新的连接
# 并向客户端返回max number of clients reached错误信息。
63) "maxclients"
64) "10000"
# 类似于慢日志,俗称看门狗。主要记录太慢的操作,如果操作该参数设置的时间则被记录(单位 毫秒),如果为0时表示
# 不开启。
65) "watchdog-period"
66) "0"
# 配置slave服务器的优先级,即当master宕机时谁被选为master的优先级。
67) "slave-priority"·
68) "100"
# 当master所连接的slave少于该参数指定的个数时,master拒绝执行写操作。
69) "min-slaves-to-write"
70) "0"
# 当master所连接的所有slave延迟都大于或者等于该参数指定的时间(单位 秒)时,master拒绝执行写操作。
71) "min-slaves-max-lag"
72) "10"
# 设定同时处理后台任务(例如关闭超时client连接,清除过期key等)的数量。提高该值会加快处理速度,但是也会占用
# 更多的cpu。
73) "hz"
74) "10"
# 节点失效检测,集群中当一个节点向另一个节点发送ping命令,但是目标节点未在该参数指定的时间内回复时,那么发送
# 命令的节点就会将目标节点标记为PFAIL(可能已失效)。
75) "cluster-node-timeout"
76) "15000"
# 该参数意思是每个主节点在分配后还有指定个数从节点的情况下触发节点分配。例如该参数为2,只要主节点大于2时才会
# 触发分配,分配后从节点个数是2。进行分配是为了保证集群中不会出现没有从节点的主节点。当某个主节点没有从节点后,
# 就会从上面触发节点分配的主节点分配一个节点过来,确保每个主节点至少有一个从节点,不至于因为主节点挂掉而没有
# 相应的从节点替换为主节点而导致集群崩溃不可用。
77) "cluster-migration-barrier"
78) "1"
# 如果设置为0,则无论从节点与主节点失联多久,在主节点宕机后,从节点都会尝试升级成为主节点。如果设置为正数,
# 则cluster-node-timeout参数乘以该参数得到的时间(单位 秒),就是从节点与主节点失联后,从节点数据有效的
# 最长时间,如果超过这个时间,从节点将不会启动故障迁移,不能成为主节点。
79) "cluster-slave-validity-factor"
80) "10"
# 在进行无磁盘主从数据传递之前会有该参数指定的时间(单位 秒)延迟,以便于slave端能够进行到等待传送的目标
# 队列中。进入队列的可以一起将数据传给队列中的slave,如果slave没有进入队列,就需要等待下次传递。
# (diskless操作请看参数repl-diskless-sync)
81) "repl-diskless-sync-delay"
82) "5"
# 保证集群的完整性,只要集群中有一个小集群出错宕机,redis就不会继续提供服务。
83) "cluster-require-full-coverage"
84) "yes"
# 在执行aof文件重写操作时,redis持久化数据写入aof文件是否先写入缓存区。如果否就需要忍受阻塞问题,等待重写
# 完成再进行持久化操作。如果设为yes,就先将持久化数据写入缓存区,如果这时候redis宕机,就会造成缓冲区丢失,
# 数据缺失。
85) "no-appendfsync-on-rewrite"
86) "no"
# 该参数如果设置为yes,则在主从复制中,从服务器可以响应客户端请求。如果设置为no,在主从复制中就会阻塞所有
# 请求,并返回错误。
87) "slave-serve-stale-data"
88) "yes"
# 如果该参数设为yes,表示slave就只能执行读操作,写操作会被放到主节点上。
89) "slave-read-only"
90) "yes"
# 在保存快照失败的情况下是否暂停写操作。
91) "stop-writes-on-bgsave-error"
92) "yes"
# redis默认不是以守护进程的方式运行,可以通过设置该参数来启用守护进程。
93) "daemonize"
94) "no"
# 指定存储至本地数据库时是否压缩数据。默认为yes,redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,
# 但会导致数据库文件变的巨大。
95) "rdbcompression"
96) "yes"
# 在保存快照以后,是否让redis使用CRC64算法来进行数据校验。
97) "rdbchecksum"
98) "yes"
# 指定是否激活重置hash。
99) "activerehashing"
100) "yes"
# 在slave和master同步后,后续操作是否设置tcp_nodelay,如果设置yes,redis会合并小的tcp节省带宽,
# 但会增加延迟,造成数据不一致。如果设置no,没有延迟。
101) "repl-disable-tcp-nodelay"
102) "no"
# master和slave传递数据时,基于socket。master创建一个新的进程直接dump rdb到slave的socket,
# 不经过主进程,不经过硬盘。默认不使用该传递方式。
103) "repl-diskless-sync"
104) "no"
# 指定AOF重写过程中,是否采用增量文件同步的策略。
105) "aof-rewrite-incremental-fsync"
106) "yes"
# redis在执行恢复时,当最后一条指令被截断时,如果配置的yes时redis会记录日志并继续,如果设置为no时,
# redis会失败退出。
107) "aof-load-truncated"
108) "yes"
# 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时
# 导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内
# 只存在于内存中。默认为no
109) "appendonly"
110) "no"
# 指定本地数据库存放目录
111) "dir"
112) "D:\\exe\\Redis-x64-3.0.504"
# 清除策略先尝试清除已到期或即将到期的Key,当此方法处理后,仍然到达最大内存设置,将无法再使用SET、LPUSH进行
# 写入操作,但仍然可以进行GET操作。
# maxmemory-policy提供了8种清除策略:
# valatie-lru:从所有最近最少访问数据范围内查找设置了过期时间的数据进行淘汰。
# allkeys-lru:从所有数据范围内查找最近最少使用的数据进行淘汰。
# volatile-random:从设置了过期时间的数据范围内随机选择key进行删除。
# allkeys-random:从所有数据范围内随机选择key进行删除。
# Noevction:不执行任何淘汰策略,当达到内存限制后会报错。默认为此策略
# volatile-ttl:从设置了过期时间的数据范围内挑选将要过期的数据进行淘汰。
# valatie-lfu:在设置了过期时间的键空间中,移除使用次数最少的key。
# allkeys-lfu:在所有键空间范围内,移除使用次数最少的key。
113) "maxmemory-policy"
114) "noeviction"
# 指定更新日志条件,共有3个可选值:
# no:表示等操作系统进行数据缓存同步到磁盘(快)
# always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
# everysec:表示每秒同步一次(折衷,默认值)
115) "appendfsync"
116) "everysec"
# 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合。
117) "save"
118) "jd 900 jd 300 jd 60"
# 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose。
119) "loglevel"
120) "notice"
# 指定客户端输出缓冲区的配置。
121) "client-output-buffer-limit"
122) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"
# 指定unix socket文件权限。
123) "unixsocketperm"
124) "0"
# 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步。
125) "slaveof"
126) ""
# Keyspace 通知使客户端可以通过订阅频道来接收那些以某种方式改动了 Redis 数据集的事件
# (触发某些事件后可以向指定的频道发送通知)。
127) "notify-keyspace-events"
128) ""
# 绑定的主机地址。
129) "bind"
130) ""
redis数据类型
String(字符串)
- string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
- string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
- string类型是Redis最基本的数据类型,一个键最大能存储512MB。
Hash(哈希)
- Redis hash 是一个键值对集合。
- Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
List(列表)
- Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。
Set(集合)
- Redis的Set是string类型的无序集合。
- 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
zset(sorted set:有序集合)
- Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
- 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
h 是一个键值对集合。
- Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)