Redis

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.1Windows下安装
下载地址: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.1port端口号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 列表

一个列表,可以存储232次方个元素,40多亿个,里面的值可以重复

语法:可以添加一个元素到头部(左边)或尾部(右边)

  设置值 lpush key value或者rpush key value

    获取值 lrange key startIndex  endIndexstartIndex0开始】

使用:lpush list AAA---在头部插入一个值

  lpush list BBB--在头部插入一个值

  rpush list CCC--在尾部插入一个值

  lrange list  0  2--输出 BBB AAA CCC每个值换行

 

3.4 Set 集合

Set集合是string类型的无序集合,增删查的复杂度都是O(1),集合内的元素是唯一的,插入重复的值,第二次插入的将会被忽略,一个集合,可以存储232次方个元素,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中字符串的子串,startIndex0开始,endIndex-1为最后一位,-2倒数第二位,以此类推。StartIndex在字符串中的位置,一定是要在endIndex之前的,比如startIndex=-1,endIndex=-5这样是不允许的,这样导致startIndex在字符串中的位置比endIndex靠后。

setrange key offset value 将指定key对应的值,从偏移量开始替换为新的值,比如strKey=”A123456789B”,执行setrange strKey 3 333strKey的值变为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 keykey中存储的数字值增加1,返回加1后的值,原值必须是整数

incrby key increment key中存储的数字值加上给定增量(必须是整数)

incrbyfloat key increment  key中存储的数字值加上给定浮点增量,计算结果只保留小数点后17

decr/decrby减量,类似于incrincrby ,但是它没有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 将指定的keysource列表中的第一个弹出,插入到keydestination的最后中。

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 移除索引在startstop区间以外的值,包含stop

Rpoplpush source destination 移除keysource中的最后一个元素,添加到keydestination的头部

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 membermember元素从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]向集合中添加元素,并赋予分值,如果添加了重复的memberscore或者不一样),结果将会返回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...]退订指定频道

 

  1. 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 在启动服务的时候设置最大连接数

 

 

 

 

 

  

  

 

posted @ 2019-12-27 09:48  凌晨10点13分  阅读(236)  评论(0编辑  收藏  举报