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)=1
decr key     # key自减1,如果key不存在,自减后get(key)=-1
incrby key k # key自增k,如果key不存在,自增后get(key)=k
decrby key k # key自减k,如果key不存在,自减后get(key)=-k
set key value # 不管key是否存在,都设置
setnx key value # key不存在,才设置
set key value xx # key存在,才设置
mget key1 key2 key3 # 批量获取key,原子操作
mset key1 value1 key2 value2 # 批量设置key-value
getset key newvalue # set key newvalue并返回旧的value
append key value # 将value追加到旧的value
    2. hash类型
[Bash shell] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
hget key field    # 获取hash key对应的field的value
hset key field value # 设置hash key对应field的value
hdel key field  # 删除hash key对应field的value
hexists key field # 判断hash key是否有field
hlen key # 获取hash key field的数量
hmget key field1 field2 ... fieldN # 批量获取hash key的一批field对应的值
hmset key field1 value1 field2 value2 ... fieldN valueN # 批量设置hash key的一批field value
hgetall key # 返回hash key对应所有的field和value
hvals key   # 返回hash key对应所有filed的value
hkeys 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指定的值前|后插入newValue
lpop key # 从列表左侧弹出一个item
rpop    # 从列表右侧弹出一个item
lrem 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) # 获取列表指定索引范围所有item
lindex key index # 获取列表指定索引的item
llen key # 获取列表长度
lset key index newValue # 设置列表指定索引值为newValue
blpop 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-key
smembers 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和element
zrem 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
posted @ 2020-04-07 08:55  幽暗森林之猪大屁  阅读(439)  评论(0)    收藏  举报