1.Redis简介
REmote DIctionary Server(Redis) 是一个key-value存储系统。C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。
2.Redis安装
2.1在Windows下安装
下载地址:https://github.com/MSOpenTech/redis/releases
下载完成后,解压到一个路径, 打开cmd窗口,通过cd命令进入redis的文件夹下,输入命令:redis-server.exe redis.windows.conf 这是启动redis的服务端。其实直接双击运行redis-server.exe也可以。这时候我们启动了redis的服务端。
服务端启动后,这个cmd窗口不要关闭,再打开一个cmd窗口,通过cd命令切换到redis目录下,输入命令redis-cli.exe -h 127.0.0.1 -p 6379。这时候这个cmd窗口就是使用redis的客户端,就可以通过redis命令,操作redis了。其实同样也可以直接启动redis目录下的redis-cli.exe,它会调用默认的host 127.0.0.1和port端口号6379。
2.2简单入门测试是否安装成功
输入命令:set akey aaa 设置一个键值对。再通过get命令获取akey对应的value,输 入命令get akey,可以看到控制台输出aaa
3. Redis操作数据类型
3.1 String 字符串
语法:设置值set key value
获取值get key
使用:set testKey AAA --设置值
get testKey --输出AAA
3.2 Hash 哈希值
语法:设置值hmset key fieldName1 value1 fieldName2 value2
获取值hmget key fieldName【注意:hmget/hget都可以】
使用:hmset testKey Name lucy Age 20--设置值
hmget testKey Age---输出20
Tip:存储对象的值,用Hash值
3.3 List 列表
一个列表,可以存储2的32次方个元素,40多亿个,里面的值可以重复
语法:可以添加一个元素到头部(左边)或尾部(右边)
设置值 lpush key value或者rpush key value
获取值 lrange key startIndex endIndex【startIndex从0开始】
使用:lpush list AAA---在头部插入一个值
lpush list BBB--在头部插入一个值
rpush list CCC--在尾部插入一个值
lrange list 0 2--输出 BBB AAA CCC每个值换行
3.4 Set 集合
Set集合是string类型的无序集合,增删查的复杂度都是O(1),集合内的元素是唯一的,插入重复的值,第二次插入的将会被忽略,一个集合,可以存储2的32次方个元素,40多亿个。
语法:设置值sadd key value
删除值srem key value
获取值smembers key
使用:sadd testSet AAA--新增值
sadd testSet BBB--新增值
sadd testSet AAA--添加重复值,将会返回-1,且不会添加到集合中
smembers testSet--列出所有值
3.5 ZSet 有序集合
Zset 是一个string类型元素的集合,且不允许成员重复,和set结合一样。不同的是zset的每个元素都会关联一个double类型的分数,redis通过这个分数给zset内的元素排序,zset成员是唯一的,但是分数是可以重复的。当添加重复的元素时,新添加的会覆盖前者。
语法:设置值zadd key score value
删除值zrem key value
获取值zrangebyscore key startScore endScore【按分数,不是按索引】
4. Redis各种数据类型的使用场景
4.1使用场景
4.2使用建议
Redis支持多个数据库,并且每个数据库的数据是隔离不共享的,并且基于单击才有,如果是集群就没有数据库的概念。一个Redis实例默认支持16个数据库,可以通过配置支持更多,没有上限。每个数据库对外都是一个从0开始递增数字命名,可以通过配置修改这一数字。当客户端与Redis建立连接后会自动选择0号数据库,不过可以随时使用select命令更换数据库,如选择1号数据库:select 1。
Redis 不支持自定义数据库的名字,每个数据库都以编号命名,我们必须自己清晰的记录哪些数据库存储了哪些数据。另外也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么一个也访问不了。虽然数据库之间的数据是不共享的,但是他们又不是绝对独立的,比如你可以通过flushall清空一个redis实例中的所有数据,所以同一个redis实例下不适宜存储不同应用程序的数据,虽然你可以这么做,但是不建议这么做,因为假设你要清空一个应用程序的数据,然后你使用了flushall命令,结果把其他应用程序的数据也删除了,这就出问题了。所以不同的应用程序,应该使用不同的Redis实例来存储数据。由于Redis非常轻量级,一个空的Redis实例占用的内存只有1M左右,所以不用担心多个Redis实例会额外占用很多的内存。
5. Redis命令
5.1 操作客户端命令
客户端输入ping,如果输出pong,测试服务端是否启动。
5.2 key部分相关命令
del keyName--删除指定名称的键
Exists keyName--判断某个键是否存在
Move keyName newDbNumber--将指定键名,移动到别的数据库中去(数字01234...),如move testKey 5--意思就是把当前操作的数据库名字为testKey键移动到5数据库
Rename keyName newKeyName--修改键名,如果newKeyName原来数据库中已存在,则原来已存在的key会被替换。
Renamenx keyName newKeyName--修改键名,会先判断newKeyName不存在时,将keyName改名为newKeyName
Type keyName--返回这个key所保存的数据类型。
5.3 字符串string相关命令
get/set读取/设置指定key的值,只能用于获取/设置字符串类型的数据,否则报错
Set key value ex seconds设置一个键值对,并设置过期时间,单位是秒,超过过期时间,这个值再执行get操作,就返回nil等同于setex
Set key value px millionseconds设置一个键值对,并设置过期时间,单位是毫秒,超过过期时间,这个值再执行get操作,就返回nil,等同于psetex
Set key value nx只有在键不存在时,才对键进行设置操作,等同于setnx
Set key value xx 只有在键存在时,才对键进行设置操作
Setex key seconds value设置键值对,并设置过期时间,单位是秒
Psetex key millionseconds value设置键值对,并设置过期时间,单位是毫秒
setnx key value 只有在key不存在时,设置key的值,意思就是不覆盖
getset key value将给定key的值设置为value,并返回key原来的old value
getrange keyName startIndex endIndex获取keyName对应的value中字符串的子串,startIndex从0开始,endIndex中-1为最后一位,-2倒数第二位,以此类推。StartIndex在字符串中的位置,一定是要在endIndex之前的,比如startIndex=-1,endIndex=-5这样是不允许的,这样导致startIndex在字符串中的位置比endIndex靠后。
setrange key offset value 将指定key对应的值,从偏移量开始替换为新的值,比如strKey=”A123456789B”,执行setrange strKey 3 333,strKey的值变为A123336789B,假设offset偏移量超出了字符串本身的长度,那么原字符串和偏移量之间的空白将用零字节(x00)进行填充
mget key1[key2,key3...]获取所有给定key的值
strlen key 返回指定key所存储的字符串的长度
mset key value [key value...]同时设置多个键值对,这是一个原子性操作,要么都设置成功,要么都不成功
msetnx key value[key value...]同时设置多个键值对,当且仅当所有给定的key都不存在,如果有存在的key,则全部不成功
Mget key[key2...]获取指定的多个键的值,如果该键不存在,则返回nil
incr key将key中存储的数字值增加1,返回加1后的值,原值必须是整数
incrby key increment 将key中存储的数字值加上给定增量(必须是整数)
incrbyfloat key increment 将key中存储的数字值加上给定浮点增量,计算结果只保留小数点后17位
decr/decrby减量,类似于incr,incrby ,但是它没有decrbyfloat
append key value如果key已存在,append会将value追加到原来key的值的后面
5.4 哈希hash命令
同一个key下,field是不能重复的。
Hset key field value设置值,如果设置了已存在的field(即使value不一样),它都会返回0,但是value是设置成功的。
hsetnx key field value 当字段field不存在时,才设置字段的值
hget key field 获取指定key中的指定字段的值
hdel key field[field2....]删除多个key指定的字段field
hexists key field 指定key中的指定字段是否存在
hgetall key 获取指定key的所有字段和值
hincrby key field increment 为指定key中的指定字段的整数值加上增量(增量必须是整数,原field的值也必须是整数)
hincbyfloat key field increment 为指定key中的指定字段的的值加上增量
hkeys key 获取指定key中的所有字段名称
hlen key 获取指定key中字段的数量
hstrlen key field获取指定key中指定字段的长度
hmget key field [field2....]获取指定key,所有给定字段的值,如果字段不存在,则返回nil
hmset key field1 value1[ field2 value2...]同时将多个字段和值设置到指定的key中
hvals key 获取哈希表中所有的值
5.5 列表List
List里面的值是可以重复的。
Blpop key1 [key2] timeout 移除指定key的第一个值,如果多个key,则按key的顺序逐个搜索,直到找到第一个,如果列表没有元素会阻塞列表知道等待超时或发现可弹出元素为止,timeout超时时间,单位是秒
Brpop key1 [key2] timeout移除指定key的最后一个值,和blpop命令类似
Brpoplpush source destination timeout 将指定的key的source列表中的第一个弹出,插入到key为destination的最后中。
Lindex key index 通过索引获取列表中的元素,如果index是负数,那么-1代表最后一个,-2代表倒数第二个 以此类推。
Llen key 获取列表的长度,也就是元素个数
Lpop key移除并返回第一个元素
Lpush key value1 [value2....]将一个或多个值插入到列表头部
Lpushx key value1 [value2....]将一个值插入到已存在的列表头部,key必须是已存在
Linsert key before|after pivot value将一个值value插入到值为pivot的前面或后面,如果没有找到pivot返回-1,如果key不存在或者空列表,则返回0
Lrange key start stop 获取列表指定范围内的元素,包含stop
Lrem key count value移除指定key中指定count个值为value的元素,当count>0时从表头开始搜索,当count<0时从表尾开始搜索(删除的元素个数就是取绝对值),当count=0的时候,移除表中所有与value相等的值。
Lset key index value通过索引设置列表元素的值,如果index超出范围,返回一个错误
Ltrim key start stop 移除索引在start和stop区间以外的值,包含stop
Rpoplpush source destination 移除key为source中的最后一个元素,添加到key为destination的头部
Rpush key value [value2]在列表的尾部插入一个或多个值
Rpushx key value为已存在的列表添加一个值,key必须是已存在
5.6集合Set
Sadd key member1[member2...]向集合添加一个或多个成员
Scard key 获取集合的成员数
Sdiff key1 [key2...]返回差集,也就是key1中有的,后面集合没有的,后面集合可以有多个
Sdiffstore destination key1[key2....]返回差集,并将差集存储到destination集合中
Sinter key1[key2...]返回所有集合的交集
Sinterstore destination key1[key2...]返回交集,并将交集存储在destination中
Sismember key member判断member是否是集合key的成员
Smembers key返回集合中的所有成员
Smove sourceKey destinationKey member将member元素从sourceKey集合中移到destinationKey集合中
Spop key 移除并返回集合中的一个随机元素
Srandmember key count随机返回count个数的元素,如果count>0则返回不重复的元素,如果count<0则返回可能重复的count的绝对值个元素
Srem key member1[member2...]删除一个或多个元素,返回成功删除的个数
Sunion key1 [key2...]返回给定集合的并集
Sunionstore destionation key1 [key2]返回给定集合的并集,并将结果存储在destionation集合中
5.5 有序集合Zset
Zadd key score member [score2 member2]向集合中添加元素,并赋予分值,如果添加了重复的member(score或者不一样),结果将会返回0,但是后者会覆盖前者的score,其实应该就是一个覆盖的操作。
Zcard key获取有序集合的成员数量
Zcount key min max获取集合中指定分数区间的成员数量
Zincrby key increment member给指定成员的分数加上增量
Zinterstore destination numkeys key1[key 2...]获取一个或多个集合的交集,存放到destination中,它们的score是各自score的和。
Zrange key startIndex stopIndex [withscores]返回指定索引区间的成员【分数也返回】
Zrangebyscore key min max[withscores]返回指定分数区间的成员【分数也返回】
Zrank key member 返回指定成员的索引
Zrem key member[member2...] 移除有序集合中的一个或多个成员
Zremrangebyrank key start stop 移除指定排名的成员【其实就是按索引删除】
Zremrangebyscore key min max 移除指定分数区间的成员
Zrevrange key start stop[withscores]返回指定索引区间的成员,分数从高到低
Zrevrangebyscore key max min[withscores]返回指定分数区间的成员,分数从高到低
Zrevrank key member 返回指定成员的排名,按分数值从高到低的排序
Zscore key member 返回指定成员的分数值
Zunionstore destination numkeys key[key 2....]返回多个有序集合的并集,并存储在destination集合中,numkeys 是指定你有多少个集合
Zrangebylex
zremrangebylex
5.6 快速计算基数HyperLogLog
就是用来快速统计出一组数据中元素的个数(排除重复的元素)
Pfadd key element[element2....]添加指定元素的HyperLogLog中
Pfcount key[key2....]返回给定Hyperloglog的基数估算值
Pfmerge destKey sourcekey[sourcekey2...]合并多个HyperLogLog集合
5.6发布订阅
Psubscribe pattern[pattern2...]批量订阅一个或多个符合给定模式的频道,通配符*,比如new*,就是匹配所有以new开头的频道
Publish channel message发布者在指定频道 发布消息
Punsubscribe pattern[pattern2....]退订所有符合给定模式的频道
Subscribe channel[channel2....]订阅多个频道消息
Unsubscribe channel[channel2...]退订指定频道
- Redis高级
6.1数据备份与恢复
备份:Save 此命令将在redis安装目录中创建dump.rdb文件,会阻塞客户端
恢复:将dump.rdb拷贝到redis安装目录,启动服务即可
Config get dir获取redis的安装目录
Bgsave 此命令在后台执行备份,通常用这个命令备份
6.2安全
Config get requirepass检查是否设置了密码
Config set requirepass newpass 设置密码
Auth pass授权登录,pass是之前设置的密码
6.3客户端连接
在redis2.4中,最大连接数是被直接硬编码在代码里面的,在2.6版本中可以对这个值进行配置,默认还是10000
Config get maxclients 获得当前配置的最大连接数
Config set maxclients count设置最大连接数
Redis-server --maxclients count 在启动服务的时候设置最大连接数