Redis 5种基本数据类型简介
一. 是什么
简述:
Redis是一个完全免费开源的,基于内存的高性能key-value存储系统,可以用作数据库、缓存和消息中间件。支持多种类型的数据结构. Redis内置数据持久化、LRU驱动事件、事物、主从复制、哨兵机制、集群、自动分区、lua脚本提供高可用性.
特点:
- 速度快:使用标准c语言编写,所有数据在内存存储,读速度:110000次/s 写速度:81000次/s
- 基本数据类型(5种):string,list,hash,set,zset. 衍生数据类型:bitmaps,hyperloglogs,地理空间
- 原子性:redis本身所有操作都是原子性,同时还通过事物,非事物流水线(pipeline),和lua脚本,保证多条命令的原子性
- 持久化:支持RDB,AOF两种方式将内存数据持久化到本地磁盘
- 高可用:支持主从复制(master-slave),哨兵机制(sentinel),集群,分片
- 其他:键空间通知(发布订阅),消息队列
架构:
- 单线程:一次只能执行一条命令,拒绝长命令(因为Redis基于内存,不牵扯磁盘IO操作限制)
- 多路IO复用模型,非阻塞IO(单个线程监控多个流I/O事件,空闲时阻塞当前线程.如果有I/o事件,则轮询一遍所有的流)
二. 什么时候用
使用场景
- 缓存: 配合关系型数据库做高速缓存(string)
- 计数器: 用户点赞,评论数,投票,网站访问量,点击率等(string)
- 分布式锁: 分布式环境下,访问共享资源(string)
- 分布式session: 分布式环境下,需要session共享(string)
- 用户信息,发布文章信息等(hash)
- 朋友圈,微博时间线,自动补全联系人(list)
- 抽奖系统,给用户添加标签,给标签添加用户、共同关注
- 排行榜(zset)
- GEO(计算两地距离,外卖小哥距你还有多少米)
三. 为什么要用
主流NoSQL对比
-
性能
都比较高,性能对我们来说应该都不是瓶颈
总体来讲,TPS方面redis和memcache差不多,要大于mongodb -
操作的便利性
memcache 数据结构单一
redis 丰富一些,数据操作方面,redis更好一些,较少的网络IO次数
mongodb 支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富 -
内存空间的大小和数据量的大小
redis 在2.0版本后增加了自己的VM特性,突破物理内存的限制;可以对key value设置过期时间(类似memcache)
memcache 可以修改最大可用内存,采用LRU算法
mongoDB 适合大数据量的存储,依赖操作系统VM做内存管理,吃内存也比较厉害,服务不要和别的服务在一起 -
可用性(单点问题)
对于单点问题
redis 依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制,因性能和效率问题,
所以单点问题比较复杂;不支持自动sharding,需要依赖程序设定一致hash 机制。
一种替代方案是,不用redis本身的复制机制,采用自己做主动复制(多份存储),或者改成增量复制的方式(需要自己实现),一致性问题和性能的权衡
Memcache 本身没有数据冗余机制,也没必要;对于故障预防,采用依赖成熟的hash或者环状的算法,解决单点故障引起的抖动问题。
mongoDB 支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制。 -
可靠性(持久化)
对于数据持久化和数据恢复,
redis 支持(快照、AOF):依赖快照进行持久化,aof增强了可靠性的同时,对性能有所影响
memcache 不支持,通常用在做缓存,提升性能;
MongoDB 从1.8版本开始采用binlog方式支持持久化的可靠性 -
数据一致性(事务支持)
Memcache 在并发场景下,用cas保证一致性
redis 事务支持比较弱,只能保证事务中的每个操作连续执行
mongoDB 不支持事务 -
数据分析
mongoDB 内置了数据分析的功能(mapreduce),其他不支持 -
应用场景
redis 数据量较小的更性能操作和运算上
memcache 用于在动态系统中减少数据库负载,提升性能;做缓存,提高性能(适合读多写少,对于数据量比较大,可以采用sharding)
MongoDB 主要解决海量数据的访问效率问题
四. 怎么用
五种数据类型常用命令:
1. string类型
[Bash shell] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
set key value # 设置指定key的值get key # 获取指定key的值del key # 删除指定key的值incr key # key自增1,如果key不存在,自增后get(key)=1decr key # key自减1,如果key不存在,自减后get(key)=-1incrby key k # key自增k,如果key不存在,自增后get(key)=kdecrby key k # key自减k,如果key不存在,自减后get(key)=-kset key value # 不管key是否存在,都设置setnx key value # key不存在,才设置set key value xx # key存在,才设置mget key1 key2 key3 # 批量获取key,原子操作mset key1 value1 key2 value2 # 批量设置key-valuegetset key newvalue # set key newvalue并返回旧的valueappend key value # 将value追加到旧的value |
2. hash类型
[Bash shell] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
|
hget key field # 获取hash key对应的field的valuehset key field value # 设置hash key对应field的valuehdel key field # 删除hash key对应field的valuehexists key field # 判断hash key是否有fieldhlen key # 获取hash key field的数量hmget key field1 field2 ... fieldN # 批量获取hash key的一批field对应的值hmset key field1 value1 field2 value2 ... fieldN valueN # 批量设置hash key的一批field valuehgetall key # 返回hash key对应所有的field和valuehvals key # 返回hash key对应所有filed的valuehkeys key # 返回hash key对应所有field |
3. list类型
[Bash shell] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
rpush key value1 value2 ... valueN # 从列表右端插入值lpush key value1 value2 ... valueN # 从列表左端插入值linsert key before|after value newValue # 在list指定的值前|后插入newValuelpop key # 从列表左侧弹出一个itemrpop # 从列表右侧弹出一个itemlrem key count value # 根据count值,从列表中删除所有value相等的项 #(1)count>0,从左到右,删除最多count个value相等的项 # (2)count<0,从右到左,删除最多Math.abs(count)个value相等项 # (3)count=0,删除所有value相等的项ltrim key start end # 按照索引范围修剪列表lrange key start end(包含end) # 获取列表指定索引范围所有itemlindex key index # 获取列表指定索引的itemllen key # 获取列表长度lset key index newValue # 设置列表指定索引值为newValueblpop key timeout # lpop阻塞版本,timeout是阻塞超时时间brpop key timeout # rpop阻塞版本,timeout是阻塞超时时间 #(如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止) 扩展应用: 1、LRUSH + LPOP = Stack 栈:先进后出 2、LPUSH + RPOP = Queue 队列:先进先出 3、LPUSH + BRPOP = Message Queue 消息队列 |
4. set类型
[Bash shell] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
sadd key element # 向集合key添加element # 如果element已经存在,添加失败srem key element # 将集合key中的element移除掉scard key # 计算集合大小sismember key element # 判断element是否在集合中srandmember key count # 从集合中随机挑选count个元素spop key # 从集合中随机弹出一个元素smove source-key dest-key item #将元素item从source-key移除添加进dest-keysmembers key # 获取集合所有元素sdiff key1 key2 # 差集sdiffstore dest-key key-name # 差集结果存入新集合sinter key1 key2 # 交集sinterstore dest-key key-name # 交集结果存入新集合sunion key1 key2 # 并集sunionstore dest-key key-name # 并差集结果存入新集合 |
5. zset类型
[Bash shell] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
|
zadd key score element(可以是多对)# 添加score和elementzrem key element(可以是多个) # 删除元素zscore key element # 返回元素的分数zcount key min max # 返回分值介于min和max之间的成员数量zincrby key increScore element # 增加或减少元素的分数zcard key # 返回元素的总个数zrange key start end s# 返回指定索引范围内的升序元素【分值】zrangebyscore key minScore maxScore # 返回指定分数范围内的升序元素【分值】zremrangebyrank key start end # 删除指定排名内的升序元素zremrangebyscore key minScore maxScore # 删除指定分数内的升序元素 |
更多学习资料可关注:gzitcast

浙公网安备 33010602011771号