目录

Redis学习(一)-redis基础

redis简介

Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志 型、Key-Value 数据库。

redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步,redis在3.0版本推出集群模式。

redis优势 1.k、v键值存储以及数据结构存储(如列表、字典) 2.所有数据(包括数据的存储)操作均在内存中完成 3.单线程服务(这意味着会有较多的阻塞情况),采用epoll模型进行请求响应,对比nginx 4.支持主从复制模式,更提供高可用主从复制模式(哨兵) 5.去中心化分布式集群 6.丰富的编程接口支持,如Python、Golang、Java、php、Ruby、Lua、Node.js 7.功能丰富,除了支持多种数据结构之外,还支持事务、发布/订阅、消息队列等功能 8.支持数据持久化(AOF、RDB)

redis的服务端启动与客户端连接

启动服务器 redis-server redis.windows.conf
关闭服务器 redis-cli shutdown
客户端连接 redis-cli
参数:

 -h <hostname>      Server hostname (default: 127.0.0.1).  
 -p <port>          Server port (default: 6379).  
 -a <password>      Password to use when connecting to the server.  
--version          Output version and exit.

redis的key操作

redis的key均为字符串,而且不能包含有空格(通过命令行客户端不能,但是通过redigo却是可以的,建议大家还是不要使用空格了),区分大小写。

redis key常用命令

  • exists key 检测指定 key 是否存在,返回 1 表示存在,0 不存在 时间复杂度:O(1)

  • del key1 key2 …… keyN 删除给定 key,返回删除 key 的数目,0 表示给定 key 都不存在。 时间复杂度:

    • 当删除一个key的时候,若value为string复杂度为O(1),否则为O(m),m为value的元素个数
    • 当删除的value为string的时候,复杂度为O(n),n为key的个数
  • type key 返回给定 key 值的类型。返回 none 表示 key 不存在 类型 set 无序集合类型……

  • keys pattern 返回匹配指定模式的所有 key,keys * 即可返回所有的key

  • randomkey 返回从当前数据库中随机选择的一个 key,如果当前数据库是空的,返回空串,个人感觉用处不大

  • rename oldkey newkey 重命名一个 key,如果 newkey 存在,将会被覆盖,返回 1 表示成功,0 失败。可能是 oldkey 不存在或者和 newkey 相同。

  • renamenx oldkey newkey 同上,但是如果 newkey 存在返回失败。nx后缀为可作not exist理解,即新key不存在才成功

  • expire key seconds 为 key 指定过期时间,单位是秒。返回 1 成功,0 表示失败;设置-1则删除key;如果已经设置了过期时间,则覆盖原来的值(这里部分手册上说重复设置时间返回0,亲测证明可以重复设置) 时间复杂度O(1)

  • persist key 去除key的有效期

  • ttl key 返回设置过过期时间key的剩余过期秒数。-2表示key不存在,-1未设置过期时间。(这里部分手册上说重复设置时间返回0,亲测证明可以重复设置)

  • expireat key timestamp和上面的expire类似,这里传的是unix timestamp,也就是1970年至今的秒数,设置一个已经过去的时间,相当于删除key

  • pexpire key milliseconds和expire类似,但是是毫秒,与之对应的是pttl,pexpireat命令(2.6.0以后可用)

  • select db-index 通过索引选择数据库,默认连接的数据库是 0,默认数据库数是 16 个。返回 1表示成功,0 失败。

  • move key db-index 将 key 从当前数据库移动到指定数据库。返回 1 表示成功。0 表示 key不存在或者已经在指定数据库中。

  • **SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern …]] [ASC|DESC] [ALPHA] [STORE destination]**对list,set,sorted set的元素进行排序,可返回排序后的结果或把结果进行保存到指定的key中 时间复杂度为O(N+M*log(M)),其中N为集合中的个数,M为返回的元素个数

    • 默认是把元素按照双精度的小数进行排序,如果我们想按字典顺序排序字符串可以使用ALPHA
    • 默认是把排序后的结果返回给客户端,但是集合本身数据位置是没有变的

redis的value操作

redis的value共有5中类型:string,list,hash,set和sorted set

string类型相关命令

string字符串最多可以存512M字节。 string 是最基本的类型,而且 string 类型是二进制安全的。意思是 redis 的 string 可以 包含任何数据。比如 jpg 图片或者序列化的对象。从内部实现来看其实 string 可以看作 byte数组,最大上限是 1G 字节。

  • set key value 设置 key 对应 string 类型的值,返回 1 表示成功,0 失败。
  • setnx key value 如果 key 不存在,设置 key 对应 string 类型的值。如果 key 已经存在,返回 0。
  • setex key seconds value 设置值并设置过期时间
  • get key 获取 key 对应的 string 值,如果 key 不存在返回 nil
  • getset key value 先获取 key 的值,再设置 key 的值。如果 key 不存在返回 nil。
  • mget key1 key2 …… keyN 一次获取多个 key 的值,如果对应 key 不存在,则对应返回 nil,m可以做multy理解
  • mset key1 value1 …… keyN valueN 一次设置多个 key 的值,成功返回 1 表示所有的值都设置了,失败返回 0 表示没有任何值被设置。
  • msetnx key1 value1 …… keyN valueN 一次设置多个 key 的值,但是不会覆盖已经存在的 key
  • incr key 对 key 的值做加1操作,并返回新的值。注意 incr 一个不是 int 的 value 会返回错误,incr 一个不存在的 key,则设置 key 值为 1,当超出范围时也会返回错误
  • decr key 对 key 的值做减1操作,decr 一个不存在 key,则设置 key 值为-1。
  • incrby key integer 对 key 加上指定值 ,key 不存在时候会设置 key,并认为原来的 value是 0。
  • decrby key integer 对 key 减去指定值。decrby 完全是为了可读性,我们完全可以通过 incrby一个负值来实现同样效果,反之一样。

从 Redis 2.6.12 版本开始, SET 命令的行为可以通过一系列参数来修改:

  • EX seconds : 将键的过期时间设置为 seconds 秒。 执行 SET key value EX seconds 的效果等同于执行 SETEX key seconds value 。
  • PX milliseconds : 将键的过期时间设置为 milliseconds 毫秒。 执行 SET key value PX milliseconds 的效果等同于执行 PSETEX key milliseconds value 。
  • NX : 只在键不存在时, 才对键进行设置操作。 执行 * SET key value NX 的效果等同于执行 SETNX key value 。
  • XX : 只在键已经存在时, 才对键进行设置操作。

我们在用redis实现分布式锁的时候可以保证setnx 和key过期时间的原子性,就是利用set key value EX time NX。

list类型相关命令

ist的元素个数最多为2^32-1个,也就是4294967295个。

这里的list可看做双向链表,key就是一个list的名字,不通过的key即为不同的list

  • lpush key value [value…] 在 key 对应 list 的左边添加字符串元素,返回 list的长度 表示成功,0 表示 key 存在且不是 list 类型。(2.4版本以后可以一次添加多个value)

  • lpushx key value 和上面的类似,但是要求key已经存在且里面含有元素

  • rpush key string 在 key 对应 list 的右边添加字符串元素。

  • llen key 返回 key 对应 list 的长度,如果 key 不存在返回 0,如果 key 对应类型不是 list返回错误。

  • lrange key start end 返回指定区间内的元素,下标从 0 开始,包含end,负值表示从后面计算,-1 表示倒数第一个元素 ,key 不存在返回空。

  • ltrim key start end 截取 list 指定区间内元素,成功返回 1,key 不存在返回错误。 时间复杂度O(N),N为要删除的元素个数

  • lset key index value 设置 list 中指定下标的元素值,成功返回 1,key 或者下标不存在返回错误。

  • lindex key index 返回index位置的值

  • lrem key count value从 List 的头部(count正数)或尾部(count负数)删除一定数量(count )匹配 value 的元素,返回删除的元素数量。count 为 0 时候删除全部;count>0从头部开始;count<0从尾部开始

  • lpop key 从 list 的头部删除并返回删除元素。如果 key 对应 list 不存在或者是空返回 nil ,如果 key 对应值不是 list 返回错误。rpop key 从 list 的尾部删除并返回删除元素。

  • rpop key从list的右边开始移除并返回元素。

  • **BLPOP key [key …] timeout ** 阻塞式弹出,设置 timeout参数为0表示永远阻塞。但把它用在 MULTI / EXEC 块当中没有意义。

  • rpoplpush key1 key2把key1右边的元素删除,并放到key2的左边。key1 key2可以为同一个。

  • linsert key BEFORE|AFTER pivot value在指定的value前/后插入新的value LINSERT mylist BEFORE “World” “There”

hash类型相关命令

键值对个数最多为2^32-1个,也就是4294967295个。

Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap

  • hset key field value 设置hash字段的值
  • hget key field 根据字段key获取hash的值
  • hdel key field [field …] 根据key删除hash容器的值,2.4版本以后支持多个key
  • hexists key field 判断是否存在key及hash字段,key或字段不存在返回0
  • hgetall key 获取所有的字段key和value,value紧跟key一同返回
  • hkeys key返回hash集合的所有字段key
  • hvals key返回包含所有字段value的list

set类型相关命令

元素个数最多为2^32-1个,也就是4294967295个。 set 是无序集合,最大可以包含(2 的 32 次方-1)个元素。set 的是通过 hash table 实现的 ,所以添加,删除,查找的复杂度都是 O(1)。关于 set 集合类型除了基本的添加删除操作,其它有用的操作还包含集合的取并集(union),交集(intersection) ,差集(difference)。

  • sadd key member 添加一个 string 元素到 key 对应 set 集合中,成功返回 1,如果元素以及在集合中则返回 0,key 对应的 set 不存在则返回错误。(2.4版本以后支持多个元素)
  • srem key member 从 key 对应 set 中移除指定元素,成功返回 1,如果 member 在集合中不存在或者 key 不存在返回 0,如果 key 对应的不是 set 类型的值返回错误。
  • spop key 删除并返回 key 对应 set 中随机的一个元素,如果 set 是空或者 key 不存在返回nil。
  • srandmember随机获取一个元素,但是不从集合中移除。
  • scard key 返回 set 的元素个数,如果 set 是空或者 key 不存在返回 0。
  • sismember key member 判断 member 是否在 set 中,存在返回 1,0 表示不存在或者 key 不存在。
  • sinter key1 key2 …… keyN 返回所有给定 key 的交集。
  • sinterstore dstkey key1 ……. keyN 返回所有给定 key 的交集,并保存交集存到 dstkey 下。
  • sunion key1 key2 …… keyN 返回所有给定 key 的并集。
  • sunionstore dstkey key1 …… keyN 返回所有给定 key 的并集,并保存并集到 dstkey 下。
  • sdiff key1 key2 …… keyN 返回所有给定 key 的差集。
  • sdiffstore dstkey key1 …… keyN 返回所有给定 key 的差集,并保存差集到 dstkey 下。
  • smembers key 返回 key 对应 set 的所有元素,结果是无序的

sorted set相关命令

元素个数最多为2^32-1个,也就是4294967295个。

sorted t set 是有序集合,它在 set 的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,会自动重新按新的值调整顺序。

  • zadd key score member 添加元素到集合,元素在集合中存在则更新对应 score。set的元素是唯一的,但是他们可以有相同的score,此时是按元素的字典顺序进行排序(2.4版本可以支持多参数)
  • zrem key member 删除指定元素,1 表示成功,如果元素不存在返回 0
  • zincrby key incr member 增加对应 member 的 score 值,返回修改后score的值
  • zrank key member 返回指定元素在集合中的排名(下标),集合中元素是按 score 从小到大排序的。
  • zrevrank key member 同上,但是集合中元素是按 score 从大到小排序。
  • zrange key start end 类似 lrange 操作从集合中去指定区间的元素。返回的是有序结果
  • zrevrange key start end返回指定区间成员,从大到小顺序。
  • zrangebyscore key min max 返回集合中 score 在给定区间的元素。
  • zcount key min max 返回集合中 score 在给定区间的数量。 [min,max]闭区间。
  • zcard key 返回集合中元素个数。
  • zscore key element 返回给定元素对应的 score。
  • zremrangebyrank key min max 删除集合中排名在给定区间的元素。
  • zremrangebyscore key min max 删除集合中 score 在给定区间的元素

其他命令

  • 清除redis的expire时间:
    • 对key的内容进行修改,包括set,del,lpush,getset等都可以
    • 对一个key进行rename,则expire会转移到新的key
    • PERSIST key(2.2.0以后可用)
  • list没有提供by index删除元素的方法,可以使用 下面的方法迂回删除
lset listkey 1 del
lrem listkey 0 del