Redis学习笔记
安转与运行
Windows下安装运行
安装:下载redis的Windows版本,解压到目标安装目录
启动服务端:在cmd窗口,切换到redis安装目录下,运行如下命令:
redis-server.exe redis.conf
redis.conf是redis的配置文件。
启动客户端:服务端不要关闭,再打开新的cmd窗口,切换到redis安装目录下,运行如下命令:
redis-cli.exe -h 127.0.0.1 -p 6379
Linux下安装运行
安装:在Linux控制台输入如下命令:
$wget http://download.redis.io/release/redis-2.8.17.tar.gz
$tar xzf redis-2.8.17.tar.gz
$cd redis-2.8.17
$make
make完后,redis-2.8.17目录下会出现编译后的redis服务程序redis-server,用于测试的客户端redis-cli,两个程序位于安装目录src目录下
启动服务端:
$cd src
$./redis-server redis.conf
启动客户端:
$cd src
$./redis-cli -h 127.0.0.1 -p 6379
配置项说明
配置文件:redis.conf
1.启用守护线程运行redis,默认是no,启用采用yes
配置项:daemonize no
2.配置pid(Process ID)写入文件位置(当redis以守护进程方式运行时,redis默认把pid写入下面的文件)
配置项:pidfile /var/run/redis.pid
3.指定redis监听端口
配置项:port 6379
4.绑定主机地址
配置项:bind 127.0.0.1
5.设置客户端闲置超长时间(秒),0表示关闭该功能
配置项:timeout 300
6.指定日志记录级别,支持四个级别:debug,verbose,notice,warning,默认verbose
配置项:loglevel verbose
注:
degug: 非常多的信息,用于调试测试
verbose:非常多的信息,但不想debug那么乱
notice: 轻量级的verbose
warning: 只有非常重要的信息
7.日志记录方式,默认为标准输出
配置项:logfile stdout
注:如果redis为守护进程方式运行,日志记录方式为标准输出,则日志将会发送给dev/null
8.设置数据库的数量,默认设置16个,可以使用 SELECT <dbid> 命令在连接上指定数据库id
配置项:databases 16
9.配置数据同步到数据文件的条件,可以设置多条配合
配置格式:save <seconds> <changes> 意义:在多少秒内有多少次更新操作
默认配置:
save 900 1
save 300 10
save 60 10000
10.配置存储数据至本地数据库是是否采用LZF压缩字符创对象,默认yes。
配置项:rdbcompression yes
注:如果关闭,则会节省CPU时间,但会造成数据库文件变大,基本上都是设置为yes。
11.配置本地数据库文件名
配置项:dbfilename dump.rdb
12.配置工作目录,本地数据库会存放到该目录
dir ./
13.设置master服务的IP和端口,在设置本机redis为slave,slave会自动从master同步数据
配置项:slaveof <masterip> <masterport>
14.设置slave连接master服务的密码(当本机redis为slave,master服务设置密码时)
配置项:masterauth <master-password>
15.设置redis连接密码
配置项:requirepass <password>
注:如果设置了连接密码,客户端在连接redis时需要通过 AUTH <password> 命令提供密码
16.设置同一时间最大客户端连接数,默认无限制,设置为0也表示不作限制
配置项:maxclients 0
注:redis可以同时打开的客户端连接数为redis进程可以打开的最大文件描述符数。当客户端连接数达到限制时,redis会关闭新的连接并向客户端发返回错误信息:max number of clients reached
17.设置redis最大内存限制
配置项:maxmemory <bytes>
注:当使用redis为状态服务器或缓存时,而不是真数据库时,设置最大内存是好建议。当达到最大内存时,redis会尝试去删除即将超时的key,或保存更长时间的key,或从闲置列表删除对象,写操作时会得到错误信息,可能导致DB不稳定。
18.设置最大内存达到是,删除策略,默认volatile-lru
配置项:maxmemory-policy volatile-lru
注:支持五种策略:
volatile-lru -> remove the key with an expire set using an LRU algorithm
allkeys-lru -> remove any key accordingly to the LRU algorithm
volatile-random -> remove a random key with an expire set
allkeys->random -> remove a random key, any key
volatile-ttl -> remove the key with the nearest expire time (minor TTL)
noeviction -> don't expire at all, just return an error on write operations
19.设置是否在每次更新操作后进行日志记录
配置项:appendonly no
redis在默认情况下,是异步的把数据写入磁盘,如果不开启,可能在断电时导致一段时间内的数据丢失,因为redis同步数据是跟据save条件执行的。
20.设置更新日志文件名,默认为appendonly.aof
配置项:appendfilename appendonly.aof
21.设置更新日志策略
配置项:appendfsync everysec
注:可选项:
no:当操作系统进行数据缓存时同步到磁盘,运行快,不安全
always:每次更新操作后都同步数据到磁盘,运行慢,安全
everysec:美标同步一次(no与always的折中)
22.设置是否启用虚拟内存机制,默认no
配置项:vm-enabled no
23.虚拟内存文件路径,不可多个redis实例共享
vm-swap-file /tmp/redis.swap
24.设置虚拟最大内存
配置项:vm-max-memory 0
注:将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memeory设置多小,所有的索引数据(keys)都是内存存储的,当vm-max-memory设置为0时,所有的value都是存在与磁盘的。
25.设置redis的swap分成的page的单个page页大小(bytes)
配置项:vm-page-size 32
注:redis swap文件分成了很多的page,一个对象可以保存在多个page上,但是一个page不能被多个对象共享,vm-page-size的大小需要根据存储的数据大小设定的,作者建议如果存储很多小对象,page大小最好设置为32bytes或64bytes。如果不确定,就是用默认值
26.设置swap文件中的page数量
配置项:vm-pages 134217728
注:页表是存储在内存中的,在磁盘上每8个page将消耗1byte内存
27.设置访问swap文件的线程数
配置项:vm-max-threads 4
注:线程数最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。
28.设置在向客户端应答时,是否吧较小的包合并为一个包发送,默认yes
配置项:glueoutputbuf yes
29.设置在超过一定的数量或最大的元素超过某一临界值时,采用一种特殊的哈希算法
配置项:
设置数量:hash-max-zipmap-entries 64
设置大小:hash-map-zipmap-value 512
30.设置是否激活重置哈希,默认yes
配置项:activerehashing yes
31.设置包含其他的配置文件
配置项:include /path/to/local.conf
注:可以在同一主机上多个redis实例之间使用同一个配置文件,同时各个实例又拥有自己特定的配置文件。
关于Key的常用命令
1.del key
//描述:删除key。
//返回值:
// "1":删除成功
// "0":删除失败
2.dump key
//描述:序列化给定的key对应的value,并返回被序列化后的值。
//返回值:如果key不存在,返回nil,否则返回被序列化后的值。
3.exists key
//描述:判断是否存在key。
//返回值:key存在则返回1,否则返回0。
4.expire key seconds
//描述:为key设置过期时间(s),key过期后将不再可用
//返回值:成功返回1,否则返回0。
5.expireat key timestamp
//以UNIX时间戳格式设置key的过期时间,key过期后将不再可用
//返回值:成功返回1,否则返回0。
6.pexpire key milliseconds
//描述:设置key的过期时间以毫秒记
//返回值:成功返回1,否则返回0。
7.pexpireat key milliseconds-timestamp
//描述:设置key过期时间的时间戳以毫秒记
//返回值:成功返回1,否则返回0。
8.keys pattern
//描述:查找所有符合给定模式的key
//返回:key的list
9.select database
//描述:切换数据库
//返回:成功返回OK,否则返回错误信息。
10.move key destination_database
//描述:将当前数据库的key移动到给定的数据库db中
//返回:成功返回1,否则返回0。如果key不存在则失败,如果目标数据库同样存在key也会失败。
11.persist key
//描述:用于移除给定key的过期时间,使key永不过期。
//返回值:成功返回1,否则返回0。
12.ttl key
//描述:返回给定key的剩余生存时间(s)
//返回值:当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。
13.pttl key
//描述:返回给定key的剩余生存时间(ms)
//返回值:当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。
14.randomkey
//描述:从当前数据库中随机返回一个key
//返回值:当数据库不为空时,返回一个 key 。 当数据库为空时,返回 nil 。
15.rename oldkey newkey
//描述:修改key的名称
//返回:改名成功提示OK,失败返回一个错误,当oldkey和newkey相同,或oldkey不存在时,返回一个错误,当oldkey和newkey都存在时,newkey的值将被oldkey的值覆盖。
16.renamenx oldkey newkey
//描述:当newkey不存在时,将oldkey重命名为newkey
//返回值:成功返回1,否则newkey存在时返回0,oldkey不存在时返回一个错误信息
17.type key
//描述:返回 key 存储的值的数据类型
//返回值:数据类型有:
none (key不存在)
string (字符串)
list (列表)
set (集合)
zset (有序集)
hash (哈希表)
字符串相关的命令
1.SET key value
//设置指定key的值,如果key已存在,旧的value将被覆盖
//返回值:成功返回OK,失败返回错误信息
2.get key
//获取key对应的value,不存在则返回nil,如果key不是字符串类型,则提示错误信息
//返回值:key存在返回key的值,不存在返回nil
3.getrange key startindex endindex
//获取key的value的子字符串(包括index所在位置的字符),index为负数时,则是从右边定位的位置
//返回值:只有当key存在,且endindex大于startindex,且startindex在value范围内,返回值为相应的值,否则返回空串
4.getset key value
//将key的值设置为value,并返回key的旧值
//返回值:如果key不存在,则设置key值为value,返回nil,当key存在但不是字符串类型是,返回一个错误
5.getbit key offset
//对key所存储的字符串值,获取指定偏移量上的位
//返回值:如果当偏移量 OFFSET 比字符串值的长度大,或者 key 不存在时,返回 0 ,否则返回真实值。
6.mget key[key1...]
//获取多个key的值
//返回值:返回一个list,如果某个key不存在或者不是String,对应返回nil
7.setbit key offset value
//对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
//返回值:成功返回1,否则返回0。对key所存储的字符串值,如果offset超出value的范围,返回0表示设置失败,但是事实已经成功了,且字符串边长,这可能是个bug,也可能我的版本比较旧。
8.setex key seconds value
//将value关联到key,并将key的过期时间设置为seconds(s)。如果key已经存在,旧值将被覆盖
//成功返回ok
9.setnx key value
//只有在key不存在时,设置key的值
//返回值:成功返回1,失败返回0。如果key已经存在,执行失败。
10.setrange key offset value
//用value参数复写给定key所存储的字符串的值,从偏移量offset开始
//返回值:被修改后的字符串长度,offset为非负整数,且offset可以超出value的长度。若key不存在则会被创建,offset之前的字符为\x00。如果offset为负则返回错误信息。
11.strlen key
//返回key所存储的字符串的长度,如果key存储的不是字符串你时,返回一个错误。
//返回值:字符串的长度,key不存在则返回0。
12.mset key value [(key value )...]
//同时设置一个或多个key-value对
//返回值:总是返回OK。
13.msetnx key value [(key value)...]
//同时设置一个或多个key-value对,当且仅当所有给定key都不存在。
//返回值:当所有key都成功设置,返回1。如果有哪个key存在,则执行失败,全部不生效。
14.psetex key milliseconds value
//与命令setnx命令相似,但以毫秒为单位设置key的过期时间
15.incr key
//将key中储存的数字值增一,如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。本操作的值限制在 64 位(bit)有符号数字表示之内。key的value必须是证书。
//返回值:执行incr之后key的值
16.incrby key increment
//将key所储存的值加上给定的增量值,如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。本操作的值限制在 64 位(bit)有符号数字表示之内。key的value值和increment必须是整数。
//返回值:执行incrby之后的key的值
17.incrbyfloat key increment
//将key所储存的值加上给定的浮点增量值,如果 key 不存在,那么 INCRBYFLOAT 会先将 key 的值设为 0 ,再执行加法操作。
//可用版本:>=2.6.0
//返回值:执行命令之后key的值。
18.decr key
//将key中储存的值减一。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。本操作的值限制在 64 位(bit)有符号数字表示之内。key的value值必须是整数。
//返回值:执行命令之后key的值
19.decrby key decrement
//key所储存的值减去给定的减量值。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECRBY 操作。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。本操作的值限制在 64 位(bit)有符号数字表示之内。key的value值和decrement必须是整数。
//返回值:执行命令之后key的值
20.append key value
//如果key存在并且是一个字符串,则将value追加到key原来值的末尾。如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。
//返回值:返回执行后字符串的长度。
发布订阅常用命令
1.psubscribe pattern [pattern...]
//订阅一个或多个符合给定模式的频道
2.pubsub subcommand [argument[argument...]]
//查看订阅与发布系统状态
3.publish channel message
将消息发送到指定的频道
4.punsubscribe [pattern [pattern...]]
退订所有给行模式的频道
5.subscribe channel [channel...]
订阅给定的一个或多个频道的信息
6.unsubscribe [channel [channel...]]
退订给定的频道
实现原理
1.订阅频道:pubsub_channels
订阅频道操作(subscribe channel):
1)如果已经存在订阅者,则添加到链表的尾部
2)如果没有订阅者,那么创建频道,然后添加订阅者
退订频道操作(unsubscribe channel):
1)找到对应的链表,进行删除
2)如果删除后,链表为空,则删除频道
2.模式订阅:pubsub_patterns
订阅模式频道操作(psubscribe pattern):
1)新建一个pubsubPattern结构
2)添加到链表的尾部
退订模式频道操作(punsubscribe pattern):
1)查找相应的pubsubPattern,然后删除
发送消息:
1)将消息发送给channel频道的所有订阅者
2)遍历整个pubsub_patterns表,查找匹配的模式,如果有一个或者多个模式与频道匹配,将消息发送给pattern模式的订阅者
事务
Redis事务和一般的数据库事务的特性基本是一样的,都有两个特性:
1)事务是一个单独的隔离操作
2)事务是一个原子操作
Redis事务的三个阶段:开始事务、命令入队、执行事务
Redis事务命令:
1.multi
//标记一个事务块的开始
//返回值:OK
2.exec
//执行所有事务块内的命令
//返回值:事务块内所有命令的返回值,按命令执行的先后顺序排列。当操作被打断时,返回空值 nil 。
3.discard
//取消事务,放弃执行事务块内的所有命令
//返回值:OK
4.watch key [key...]
//监视一个或多个key,如果在事务执行之前这个或这些key被其他命令所改动,那么事务将被打断
//返回值:OK
5.unwatch
//取消watch命令对所有key的监视
//返回值:OK
执行脚本
Redis脚本使用Lua解释器来执行脚本。
Redis脚本命令
1.eval script numkeys key [key ...] arg [arg ...]
执行Lua脚本
2.evalsha sha1 numkeys key[key ...] arg [arg ...]
通过加载到内存中的Lua脚本的SHA1值执行Lua脚本
3.script exists script [script ...]
通过SHA1校验查看指定的脚本是否已经被保存在缓存当中
4.script flush
从脚本缓存中移除所有脚本
5.script kill
杀死当前正在运行的Lua脚本
6.script load script
将脚本script添加到脚本缓存中,但并不立即执行这个脚本
客户端连接
Redis连接命令主要是链接redis服务
1.auth password
//验证密码是否正确
//返回值:密码匹配时返回OK,否则返回一个错误
2.echo message
//打印字符串,不能打印key的内容
//返回值:返回字符串本身
3.ping
//查看服务是否运行
//返回值:如果连接正常就返回一个PONG,否则返回一个连接错误
4.quit
//用于关闭当前客户端与redis服务的连接,一旦所有等待中的回复顺利写入到客户端,连接就会被关闭。
//返回值:OK
5.select index
//用于切换到指定的数据库,数据库索引号index用数字值指定,以0作为起始索引值
//返回值:OK