Redis是什么
Redis 是一种基于键值对的NoSQL数据库,Redis的值可以是string、hash、list、set、zset、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构与算法组成。所以Redis可以满足多种应用场景,且Redis是将所有的数据放在内存中,所以它的读写能力十分惊人。除此之外,Redis还提供了RDB与AOF两种持久化策略。防止在意外情况下redis中的重要数据“丢失”,Redis还提供了key过期、发布订阅、事务、流水线、Lua脚本等附加功能。在合适的场景使用它会极大的提高性能。
Redis的特性
- Redis的最大的特性就是速度快。这是因为它将所有的数据放在了内存中,在内存中redis的相应速度大约为100ns,官方给出的读写性能可达到10万/秒。当然这也取决于机器性能。Redis是用C语言实现距离操作系统十分近,执行速度相对较快,且redis的单线程架构预防了多线程的竞争问题。
- redis是基于键值对的数据结构服务器
- 有着丰富的功能(key过期、发布订阅、Lua脚本、流水线、事务等)
- 简单稳定。redis的源码很少且使用单线程模型,使得redis十分简单。虽然简单但是它十分稳定。
- 支持redis的语言多
- 拥有持久化策略
- 主从复制
- 高可用和分布式。redis从3.0开始提供了分布式实现redis cluster ,提供了高可用、读写和容量的扩展性。
Redis支持的数据类型
- 字符串类型(string)
字符串类型是Redis最基础的数据结构,其他集中数据结构都是再此基础上构建的。字符串类型的值可以是字符串(简单的字符串、复杂的字符串)、数字、甚至二进制等。但是它的值最大不超过512mb。 - 哈希(hash)
几乎所有的编程语言都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组。它是一个键值对结构每一个key里面都有多个field-value - 列表(list)
list是用来存储多个有序的字符串,list中每个字符串被称为元素,一个list最多可以存储2^32-1个元素。在Redis中可以对列表两端插入(push)和弹出(pop)。这是一种比较灵活的数据结构,可以充当栈和队列的角色。 - 集合(set)
集合也是用来存储多个的字符串元素,但和列表不同,它不允许存在重复的元素。并且集合中的元素是无序的,不能通过索引下标获取元素。Redis支持集合内的增删改查也支持集合间的取交集、并集、差集。 - 有序集合(zset)
有序集合相比较于哈希、列表、集合,它不仅有集合不存在重复元素的特性且可以排序。它的排序规则是依据它给每个元素设置的分数。
数据结构 | 是否允许重复元素 | 是否有序 | 有序实现方式 |
---|---|---|---|
列表 | 是 | 是 | 索引下标 |
集合 | 否 | 否 | 无 |
有序集合 | 否 | 是 | 分值 |
Redis的基本命令
对key的操作
- keys [pattern] 获取当前redis中的key。它的参数支持正则表达式。例如:使用keys * 表示获取当前所有的key,它的时间复杂度是O(n),所以在实际生产中结合实际要慎重使用。也可以使用keys stu* 表示获取以stu开头的所有key
- del key1,key2,… 删除key,可以一次删除多个key,返回的结果是删除的key的个数。
- exists key1 key2 … 判断key是否存在,可以一次传入多个key存在几个返回相应的个数
- rename key newkey 对key进行重命名。需要注意的是redis是将旧key删除,再重新加入新key
- randomkey 随机返回一个key
- expire key seconds 对key设置过期时间单位为秒
- expireat key timestamp 对key设置过期时间单位为秒级时间戳
- ttl key 查看key的剩余过期时间,key不存在返回-2.永不过期返回-1
- pttl key 查看key的过期时间,单位为毫秒级
- pexpire key milliseconds 给key设置过期时间 单位为毫秒
- pexpireat key milliseconds-timestamp key在毫秒级时间戳后过期
- persist key 将key的过期时间清除
在对key设置过期时间时候,如果key不存在返回0,如果过期时间为负值则key会立刻被删除。对于字符串类型的key,执行set命令会去掉过期时间。
字符串的操作
- set key value [expiration EX seconds | PX milliseconds] [NX|XX] 例如,set hello word set的几个参数:EX seconds | PX milliseconds 设置过期时间,ex为秒,px为毫秒级。nx必须key不存在才可以添加成功,xx与其相反
- setex | setnx key value 与上述中的EX XX类似
- get key 用于获取值。例如 get hello 则会得到word 如果key不存在则返回nil(空)
- mset key1 value1 key2 value2… 批量设置key
- mget key1 key2 … 批量获取key的value
- incr key 对key的value自增。它的返回分为三种情况,如果value不是整数则返回错误。值是整数则返回自增后的结果,key不存在按照0自增,返回1.
- decr key 与自增相应的,decr的作用是自减
- incrby | decrby key increment | decrement 增加或减少指定的数
- incrbyfloat key increment 自增浮点数
- append key value 在key对应的value的尾部增加指定的字符串
- strlen key 获取key对应的value的长度
- getset key value 它的作用与set一样,可以设置key的value,不同的是他可以返回key原来的值。例如:getset hello word (没有值的时候)返回nil,在执行getset getset hello redis 返回word
- setranage key offeset value 设置offeset位置的值。例如:set redis rest在执行setrange redis 0 b 那么redis的value就会变成best
- getrange key start end 获取key从start位置开始到end结束对应的value 的字符串
对hash的操作
- hset key field value 一个key对应一个或者多个field-value键值对,设置成功返回1,hsetnx与setnx类似,不同的地方在于哈希的作用域为field
- hget key field 获取key下的field对应的value
- hdel key field 删除key中的field
- hlen key 计算key中field的个数
- hmget | hmset key field | field1 value1 field2 value2… 批量获取|设置field的value
- hexists key field 判断field是否存在
- hkeys key 获取key下的所有的field
- hvals key 获取key下所有的value
- hgetall key 获取key下所有的field-value
- hincrby | hincrbyfloat key field 与incrby和incrbyfloat命令一样,但哈希的作用范围是field对应的value
- hstrlen key field 计算field对应的vlaue的长度
对list的操作
- rpush key value [value2 value3…] 从右侧插入元素,一次可以插入多个元素
- lpush key value [value2 value3 …] 从左侧插入元素,可一次插入多个元素
- linsert key before | after pivot value 该命令会在list中找到等于pivot的元素,并在它的前(before)或者后(after)插入一个新的元素value
- lrange key start end 从左到右获取list下表从start(包含)到end(包含)的所有元素
- lindex key index 获取key对应的list的index位置的元素
- llen key 获取key对应的list的长度
- lpop key 从列表的左侧弹出元素
- rpop key 从列表的右侧弹出元素
- lrem key count vlaue 该命令会从列表中找到等于value的元素进行删除, count>0从左到右删除最多count个元素,count<0 从右到左删除最多count绝对值个元素,count =0 删除所有
- ltrim key start end 保留从start 到end的元素其他的会被删除
- lset key index newValue 将列表中index位置的元素替换为newValue
- blpop | brpop key [key1 …] timeout 阻塞式操作。timeout为阻塞时间,列表为空的时候timeout为0则会一直等下去,否者等待timeout秒后结束,期间加入新元素则立即返回。列表不为空会立即返回
list的这种结构十分适用于栈 与队列
对set的操作
- sadd key element [element1,element2 …] 向集合中增加一个或多个元素,返回结果为添加成功的元素个数
- srem key element [element 2, element 3 …] 从集合中删除元素,返回结果为删除成功的元素个数
- scard key 计算key对应的集合有多少个元素
- sismember key emement 判断该元素是否在集合中,如果在,则返回1,否者返回0
- srandmember key [count] 随机从集合中获取count个元素,默认是1
- spop key [count] 随机从集合中弹出count个元素,默认为1。 从redis 3.2版本开始,支持count参数。
- smembers key 获取所有的元素
- sinter key [key2 key3 …] 求多个集合的交集
- sunion key [key2 key3 …] 求多个集合的并集
- sdiff key [key2 key3 …] 求多个集合的差集
对zset的操作
- zadd key score member [score member sore member …] 像有序集合添加成员与它对应的score
- zcard key 计算成员的个数
- zscore key member 计算某个成员的分数,如果成员不存在则返回nil
- zrank | zrevrank key member 从分数从低到高(zrank)或从高到低(zrevrank)返回排名
- zrem key member [member2 mermber3 …] 删除成员
- zincrby key increment member 给成员增加分数
- zrange | zrevrange key start end [withscores] 返回指定排名范围的成员,从低到高或从高到低,如果有withscores参数,则同时返回分数
- [zrangebyscore | zrevrangebyscore] key [min | max] [max | min] [withscores] [limite offset count] 按照分数从低到高或者从高到低返回min到max 或 max到min ,的成员 withscores返回成员分数,limit offset count可以限制输出的起始位置和个数。
- zcount key min max 返回指定分数范围的成员个数、
- zremrangebyrank key start end 删除指定排名内的升序元素
- zremrangebyscore key min max 删除从 min 到max 分数范围内的成员