redis介绍
- Redis数据库是一个非关系型数据库(nosql),是一个内存数据库. 以键值对的形式存储数据
- Redis支持的数据类型 string hash list set zset
- Redis新增数据类型Bitmaps HyperLogLog Geospatial
- 单线程架构:redis使用单线程架构和I/O多路复用模型来实现高性能内存数据库服务。
redis为什么快
1-纯内存访问
2-非阻塞io:redis使用epoll作为I/O多路复用技术的实现以及使用自身事件模型;
3-单线程避免线程切换和竟态产生的消耗
key键操作
- keys *:查询当前库所有key
- exists key:查询是否存在某个key
- type key:查询可以的类型
- del key:删除指定key
- unlink key:删除指定key,仅将key从keyspace元数据中删除,真正的删除会在后续的异步操作
- expire key:为给定的key设置过期时间
- tttl key:查看key还有多少秒过期,-1表示永不过期,-2表示已过期
- select:切换数据据库
- dbsize:查看当前数据库key的数量
- flushdb:清空当前库
- flushall:清空所有库
Redis字符串(String)
1.基本操作指令
- set key value:添加键值对,如果key已存在,覆盖value的值
- get key:查询对应键值对
- append key value:在指定key的value末尾追加值
- strlen key:获取指定key的value的长度
- setnx key value:在key不存在时,设置key的值
- incr key:将key对应的value值增加1,只能对数字值操作,如果为空,新增值为1
- decr key:将key对应的value值减小1,只能对数字值操作,如果为空,新增值为-1
- incrby key len:将key对应的value值增加len
- decrby key len:将key对应的value值减小len
- mset key value:同时设置多个key-value值对
- mget key:同时获取多个key-value值对
- getrange
2.原子操作
- 原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会切换到其它线程
- 在单线程中,能够在单条指令中完成的操作,都可以认为是原子操作。
- 在多线程中,不能被其它线程(进程)打断的操作就叫原子操作
- Redis单命令的原子性主要得益于Redis是单线程
3.数据结构
- 底层为动态字符串,是可以修改的字符串
- 采用预分配冗余空间的方式来减少内存的频繁分配
- 如果字符串长度小于1M,扩容为原来的一倍,如果超过1M,每次扩容1M,并且最大为512M
Redis列表(List)
1.简介
- Redis列表是简单的字符串列表,可以在列表头部(左侧)或者尾部(右侧)添加元素
- 底层为双向链表,两端数据操作性能高,通过下标操作中间部位元素性能较低
2.常用命令
- lpush:从左边插入一个或者多个值
- rpush:从右边插入一个或者多个值
- lrange:获取某个key指定起始位置和结束位置的所有值
- lpop:从左边取出一个值
- rpop:从右边取出一个值
- rpoplpush key1 key2:从key1右侧取出一个值,插入到key2左侧
- lindex:根据指定索引下标,获取元素
- llen:获取列表长度
- linsert key before value newvalue:在值value前插入新的值newvalue
- lrem key n value:从左边删除n个指定的元素
- lset key index value:将指定位置的元素值替换为value
3.数据结构
- 底层为快速链表quicklist
- 在列表元素较少时,分配一块连续的内存存储,这个结构是ziplist,也即是压缩链表;数据量较多时才会改成quicklist
- Redis将链表和ziplist结合起来组成quicklist,也就是将多个ziplist使用双向指针串联起来
Redis集合(Set)
1.简介
- Set功能与List功能类似,特殊之处在于set可以自动去重
- Set是String类型的无序集合,它底层是一个value为null的hash表,所以添加、删除、查找的复杂度是O(1)
2.常用命令
- sadd:将一个或者多个值添加到Set集合
- smembers:取出集合的所有值
- sismember:判断集合中是否存在某个值,存在为1,不存在为0
- scard:获取集合元素个数
- srem:删除集合中的一个或者多个元素
- spop:随机从集合中取出指定个数元素,默认取出一个,会从集合中把取出元素删除
- srandmember:随机从集合中取出指定个数元素,不会从集合中把取出元素删除
- smove:将一个集合中的值移动到另一个集合
- sinter:返回两个集合的交集元素
- sunion:返回两个集合的并集元素
- sdiff key1 key2:返回两个集合的差集元素(key1中元素,不包含key2的)
3.数据结构
- Set数据结构是dict字典,字典是用hash表实现的
Redis哈希(Hash)
1.简介
- Redis Hash是一个键值对集合
- Redis Hash是一个String类型的field和value的映射表,适合存储对象数据。
2.常用命令
- hset :向集合中添加field-value元素
- hget:获取集合中元素
- hmset:批量添加元素
- hexists:判断哈希表key中是否存在filed,存在为1,不存在为0
- hkeys:获取集合所有field
- hvals:获取集合所有value
- hincrby:将指定field的值增加指定的值
- hsetnx:当filed在集合中不存在时,向集合中添加field-value元素
3.数据结构
- 当field-value长度较小,个数较少时,使用ziplist;否则使用hashtable
Redis有序集合Zset(sorted set)
1.简介
- 是一个没有重复元素的字符串集合
- 集合中每个成员关联了一个评分(score),并且会按照评分从低到高的顺序进行排序。
- 集合中成员唯一,但是评分可以重复
2.常用命令
- zadd:将一个或者多个元素及其score添加到有序集合key中
- zrange:获取集合中所有元素,从小到大排序
- zrevrange:获取集合中所有元素,从大到小排序
- zrangebyscore:获取指定评分区间的值,结果从小到大排序
- zrevrangebyscore:获取指定评分区间的值,结果从大到小排序
- zincrby:为指定元素的score增加值
- zrem:删除指定元素
- zcount:获取指定评分区间内元素的个数
- zrank:获取元素在集合内的排名,从0开始
3.数据结构
- zset底层使用了两个数据结构:hash和跳跃表
- hash的作用:关联value和score,保证元素value唯一,可以通过value找到score
- 跳跃表的作用:给元素value排序,可以根据score的范围获取元素