持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
基本介绍
定义
redis是一个key-value存储系统
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
数据结构服务器,数据都是缓存在内存中,周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,操作原子性
1)、数据结构和内部编码
2)、单线程
1、一次只运行一条命令
2、拒绝长(慢)命令
3、其实不是单线程
独立的线程来执行 fysnc file descriptor、close file descriptor
3)、生命周期
Api大全
数据类型
string(字符串)、list(链表)、set(集合)、zset(有序集合)、hash(哈希类型)
1)、通用API
1、keys :遍历所有的key,O(n);一般不在生产环境使用
2、dbsize :计算key的总数,O(1)
3、exists key:检查key是否存在,O(1)
4、del key:删除指定的key及对应的value,O(1)
5、expire key timeout:设置key在timeout秒后过期,O(1)
6、ttl key:查看key剩余的过期时间,O(1)
7、persist key:去掉key的过期时间,O(1)
8、type key:返回key的数据类型,O(1)
2)、string(字符串)API
最大不能超过512M。
1、get key:获取key对应的value,O(1)
2、set key value:设置key-value,不管key是否存在,都设置,O(1)
3、del key:删除key-value,O(1)
4、incr key:key自增1,如果key不存在,先设为0,自增后get(key)=1,O(1)
5、decr key:key自减1,如果key不存在,先设为0,自减后get(key)=-1,O(1)
6、incrby key k:key自增k,如果key不存在,先设为0,自增后get(key)=k,O(1)
7、decr key k:key自减k,,如果key不存在,先设为0,自减后get(key)=-k,O(1)
8、setnx key value:key不存在才设置,O(1)
9、set key value xx:key存在才设置,O(1)
10、mget key1 key2 key3...:批量获取key对应的value,原子操作,O(n)
n次get = n次网络时间+n次命令时间
1次mget = 1次网络时间+n次命令时间
11、mset key1 value1 key2 value2...:批量设置key-value,O(n)
12、getset key newvalue:set key newvalue并返回就的value,O(1)
13、append key value:将value追加到旧的value,O(1)
14、strlen key:返回字符串的长度(注意中文),O(1)
3)、Hash 哈希结构API
结构:key ——> field:value;field不能相同,value可以相同
小redis,map
1、hget key field:获取hash key对应的field的value,O(1)
2、hset key field value:设置hash key对应的field的value,O(1)
3、hdel key field:删除hash key对应的field的value,O(1)
4、hexists key field:判断hash key是否有对应的field,O(1)
5、hlen key:获取hash key field的数量,O(1)
6、hmget key field1 field2...:批量获取hash key的一批field对应的值,O(n)
7、hmset key field1 value1 field2 value2...:批量设置hash key的一批field value,O(n)
8、hgetall key:返回hash key对应的所有的field和value,O(n);尽量避免使用,单线程,键太多
9、hvals key:返回hash key对应的所有的field的value,O(n)
10、hkeys key:返回hash key对应的所有field,O(n)
11、hsetnx key field value:设置hash key对应的field的value(如field已存在则失败),O(1)
12、hincrby key field intCounter:hash key对应的field的value自增intCounter,O(1)
13、hincrbyfloat key field floatCounter:hincrby浮点数版本,O(1)
4)、list 列表结构API
特点:有序,可以重复,左右两边插入弹出
使用:
1、栈(Stack)= RUSH + LPOP
2、队列(Queue)= LPUSH + RPOP
3、控制有固定数量的列表(Capped Collection)= LPUSH + LTRIM
4、消息队列(Message Queue)= LPUSH + BRPOP
1、rpush key value1 value2...:从列表右端插入值(1n个),O(1n)
如:rpush likey c b a:c—b—a
2、lpush key value1 value2...:从列表左端插入值(1n个),O(1n)
如:lpush likey c b a:a—b—c
3、linsert key before|after value newValue:在list指定的value值前|后插入newValue,O(n);
需要遍历整个列表
如:a—b—c—d => linsert listkey before b java => a—java—b—c—d
4、lpop key:从列表左边弹出一个元素,O(1)
5、rpop key:从列表右边弹出一个元素,O(1)
6、lrem key count value:根据count值,从列表中删除所有value相等的项,O(n)
(1)count>0,从左到右,删除最多count个value相等的项
(2) count<0,从右到左,删除最多Math.abs(count)个value相等的项
(3) count =0,删除所有value相等的项
如:lrem listkey 0 a:删除列表listkey的所有值等于a的项
7、ltrim key start end:按照索引范围修剪列表,O(n)
如: a—b—c—d—e—f => ltrim listkey 1 4 => b—c—d—e
8、lrange key start end(包含end):获取列表指定范围内的元素,O(n)
9、lindex key index:获取列表指定索引的元素,O(n)
10、llen key:获取列表的长度,O(1)
11、lset key index newValue:设置列表指定索引值为newValue,O(n)
12、blpop key timeout:lpop阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞,O(1)
13、brpop key timeout:rpop阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞,O(1)
5)、set 集合API
无序、没有重复元素、支持集合间操作
使用:
1、sadd=Tagging (标签)
2、spop/srandmember=randon item(生成随机数,比如抽奖)
3、sadd+sinter=Social Graph (社交需求)
1、sadd key element:向集合key添加element,element存在则添加失败,O(1)
2、srem key element:将集合key中的element移除,O(1)
3、scard key:计算集合大小
4、sismember key value:判断value在集合中是否存在,存在则返回1
5、srandmember key count:从集合key中随机挑选count个元素,不会删除这些数据
6、spop key:从集合中随机弹出一个元素,并删除这个元素
7、smembers key:获取集合所有的元素,返回结果无序;如果集合元素太多容易阻塞redis
8、sdiff key1 key2....:计算集合1和集合2之间的差集
9、sinter key1 key2....:计算集合1和集合2之间的交集
10、sunion key1 key2...:计算集合1和集合2之间的并集
11、sdiffstore|sinterstore|sunionstore destkey key1 key2...:将差集、交集或并集的结果保存在destkey中
6)、zset 有序集合API
有序集合是通过score(分数)来对element(元素)进行排序的
1、zadd key score element:向有序集合key添加element对应的score,O(n)
2、zrem key element:删除有序集合key中的元素element,O(1)
3、zscore key element:返回有序集合key中的元素element对应的分数score
4、zincrby key increScore element:将有序集合key的元素element对应的score增加或减少increScore
5、zcard key:返回有序集key的总个数 ,O(1)
6、zrank key element:返回有序集key中成员element的排名,score 从小到大
7、zrange key start end:获取指定范围内排名的值:指定范围内排序规则是升序。从低到高
8、zrangebyscore key minScore maxScore:获取指定分数内的元素值,从低到高
9、zcount key minScore maxScore:获取指定分数内的元素个数
10、zremrangebyrank key start end:移除指定集合中排名介于start至end之间的所有成员
11、zremrangebyscore key minScore maxScore:移除指定集合中分数介于minScore至maxScore之间的所有成员
12、zrevrank key element:返回element在集合中的排名,排名从高到低
13、zrevrange key start end:zrange的倒序版本
14、zrevrangebyscore key minScore maxScore:获取指定分数内的元素值,从高到低
15、zinsterstore destination numkeys key:计算给定的一个或多个有序集的交集,其中给定key的数量必须以numkeys参数指定,并将该交集(结果集)储存到destination
16、zunionstore destination numkeys key:计算给定的一个或多个有序集的并集,其中给定key的数量必须以numkeys参数指定,并将该交集(结果集)储存到destination