之前的文章中说了Redis的常见应用场景和特性,在特性章节中也大致说了数据结构契合场景。因为我想在更深入、更全面的学习Redis之前,了解场景和特性,才能在学习时更加全面且理解更透彻:

  • redis的什么特性支持这些应用场景?
  • 为什么这些场景下使用redis会带来好处?

数据类型

Redis数据结构大体上是一种key-value形式,根据value的不同数据类型,将其分为以下几种。其中Bitmap并不是一种新的数据类型,它其实是将String类型的每一位限制成0或1实现,详见Bitmaps文档。

数据类型 描述 操作命令 应用场景
String value是String set、get、incr、incrby、setnx、 setex、 k-v分布式缓存、分布式锁、 过期值、分布式session
List value是List列表 lpush、lpop、lrange、 rpush、rpop、 lindex、llen、lrem、 brpop 任务队列、消息队列、最新信息
Hash value是Hash映射表 hset、hget、hdel、 hexists、hgetall、 hincby、hkeys、hlen、 hmset 对象缓存
Set value是无序的Set集合 sadd、smembers、sismembers、 scard、sinter、sdiff、sunion、 spop、srem 文章tag
Sorted Set value是有序的Set集合 zadd、zcard、zcount、zincrby、 zrange、zrangebylex、 zrangebyscore、zrank、 zrem、zrevrange 排行榜
Bitmap value是0/1 setbit、getbit、bitcount、 bittop 用户状态、用户在线时间

除了以上几种,Redis还支持hyperloglogs和geospatial类型,由于不是很常用,这里不做介绍。具体可以参考方Introduction to Redis文档。

每种数据类型除了各自相应的读写删命令,这些数据类型还有共性命令。为何共性,因为这些共性命令是作用在key上,上面也说到了,redis的数据结构大体上是key-value结构。

exists命令

1.语法:

exists key [key...]

2.用途:

用于检测指定key是否存在

del命令

1.语法

del key [key...]

2.用途

删除指定key

expire和pexpire命令

1.语法

expire key seconds

pexpire key millseconds

2.用途

expire用于设置key的过期时间,单位秒。pexpire也是用于设置key的过期时间,单位毫秒

keys命令

1.语法

keys pattern

2.用途

用于查找指定模式的key,支持glob-style pattern。详情参考KEYS pattern文档

简单的命令操作

Redis提供了操作的命令行redis-cli,在下载的redis包中的bin目录下。在启动了redis-server的前提下,直接运行redis-cli即可进入redis命令行:

$ redis-cli
127.0.0.1:6379>
127.0.0.1:6379>

下面通过redis-cli命令行来认识下redis中的常用数据类型

1.String类型

// set命令设置k-v
127.0.0.1:6379> set key value
OK // get命令获取指定key的值
127.0.0.1:6379> get key
"value" //setnx如果key存在则不设置,否则设置
127.0.0.1:6379> setnx key value
(integer) 0
127.0.0.1:6379> setnx key1 value1
(integer) 1 //setex设置k-v和过期时间
127.0.0.1:6379> setex key2 60 value2
OK
127.0.0.1:6379> ttl key2
(integer) 56
127.0.0.1:6379> ttl key2
(integer) 54 //incr指定key的值自增长
127.0.0.1:6379> set key3 5
OK
127.0.0.1:6379> incr key3
(integer) 6 //incrby指定key的值增长幅度
127.0.0.1:6379> incrby key3 100
(integer) 106

2.List类型

//lpush从左边推入value至list中
127.0.0.1:6379> lpush list value1 value2 value3
(integer) 3 //lrange按范围获取list中的value,
//第一个表示起始索引,第二个表示结束索引。-1表示所用
127.0.0.1:6379> lrange list 0 -1
1) "value3"
2) "value2"
3) "value1" //rpop表示从右边弹出一个value
127.0.0.1:6379> rpop list
"value1" //lindex获取指定位置的vlaue
127.0.0.1:6379> lindex list 0
"value3" //llen获取list的大小
127.0.0.1:6379> llen list2
(integer) 8 //brpop阻塞从右边弹出元素。参数5指定阻塞超时时间,0表示永久
127.0.0.1:6379> brpop list2 5
(nil)
(5.04s)

3.Hash类型

//hset设置映射表的k-v
127.0.0.1:6379> hset map name lxy
(integer) 1 //hmset同时设置多个映射表的k-v
127.0.0.1:6379> hmset map age 11 sex male
OK //hgetall获取映射表的所有k-v
127.0.0.1:6379> hgetall map
1) "name"
2) "lxy"
3) "age"
4) "11"
5) "sex"
6) "male" //hget获取映射表的指定k的v
127.0.0.1:6379> hget map age
"11" //hlen获取映射表的大小
127.0.0.1:6379> hlen map
(integer) 3 //hexists探测映射表的指定k是否存在
127.0.0.1:6379> hexists map address
(integer) 0 //hdel删除映射表指定k-v
127.0.0.1:6379> hdel map name
(integer) 1 //hincrby幅度增长映射表指定k的v
127.0.0.1:6379> hincrby map age 20
(integer) 31

4.Set类型

//sadd向set中添加v,无重复
127.0.0.1:6379> sadd set v1 v2 v3 v4 v4 v5
(integer) 5 //scard探测set元素个数
127.0.0.1:6379> scard set
(integer) 5 //smembers获取set所用元素
127.0.0.1:6379> smembers set
1) "v4"
2) "v1"
3) "v2"
4) "v3"
5) "v5" //探测指定set是否存在某个元素
127.0.0.1:6379> sismember set v8
(integer) 0 //sinter计算多个set的交集
127.0.0.1:6379> sinter set set1
1) "v3"
2) "v5" //sunion计算多个set的并集
127.0.0.1:6379> sunion set set1
1) "v6"
2) "v2"
3) "v3"
4) "v9"
5) "v4"
6) "v1"
7) "v7"
8) "v5"
9) "v8" //计算第一个set与其他set的差集
127.0.0.1:6379> sdiff set set1
1) "v2"
2) "v4"
3) "v1"

5.Sorted Set类型

//zadd想sorted set中添加元素
127.0.0.1:6379> zadd ss 0 v0 1 v1 3 v4 4 v3 5 v5
(integer) 5 //zcard计算sorted set的元素个数
127.0.0.1:6379> zcard ss
(integer) 5 //zcount统计指定score范围的元素个数
127.0.0.1:6379> zcount ss 0 1
(integer) 2 //zrange获取指定索引范围的元素
127.0.0.1:6379> zrange ss 0 3
1) "v0"
2) "v1"
3) "v4"
4) "v3"

5.Bitmap类型

//setbit设置指定bit位v
127.0.0.1:6379> setbit user 1 0
(integer) 0
127.0.0.1:6379> setbit user 2 1
(integer) 0
127.0.0.1:6379> setbit user 3 1
(integer) 0
127.0.0.1:6379> setbit user 4 0
(integer) 0 //getbit获取指定bit位的v
127.0.0.1:6379> getbit user 2
(integer) 1 //统计指定key的bit位为1的个数
127.0.0.1:6379> bitcount user
(integer) 2

6.通用键

//expire设置k的过期时间
127.0.0.1:6379> expire user 5
(integer) 1
127.0.0.1:6379> ttl user
(integer) 1
127.0.0.1:6379> exists user
(integer) 0 //keys探测redis中存在哪些k
127.0.0.1:6379> keys *
1) "sk"
2) "name"
3) "ss"
4) "map"
5) "set"
6) "m"
7) "set1"
8) "list"
9) "k" //del删除指定的k
127.0.0.1:6379> del name sk map
(integer) 3

以上是以命令的方式学习理解redis的数据结构,但是在日常开发中基本上是使用某种语言的redis客户端与redis交互操作。

redis支持丰富的各种语言的客户端,单独对java而言就存在很多种选择,jedis是一个非常不错和普遍被使用的java版本redis client。开源地址xetorthio/jedis,对于jedis的使用api,可以参考其开源项目中的丰富测试类jedis/src/test/java/redis/clients/jedis/tests/commands/

参考

An introduction to Redis data types and abstractions

Redis(三)数据类型的更多相关文章

  1. Redis笔记(三)Redis的数据类型

    前面说过,Redis的一大特性是支持丰富的数据类型, 这为更多的应用场景提供了可能. Redis有五种数据类型,包括string,list,set,sorted set和hash,注意,Redis的数 ...

  2. redis 小结三-数据类型

    redis 的数据类型主要有五种 字符串(String) 哈希表(Hash) 列表(List) 集合(Set ) 有序集合(Sorted Set) 1. 字符串 一个 key 对应一个 value 该 ...

  3. Redis系列(二):Redis的数据类型及命令操作

    原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...

  4. Redis的数据类型及其常用命令

    快速入门Redis 首先安装redis: windows下安装redis Linux下安装redis 1. 什么是redis Redis属于nosql(非关系型数据库) 关系型数据库是基于关系表的数据 ...

  5. Redis的数据类型及相关操作命令

    redis 基础内容 —— redis的数据类型及相关操作的Linux命令.所谓大厦千层基础承载,希望大家认真学习这一讲: 一.redis 的五大数据类型: 1.String(字符串): 2.List ...

  6. Redis之Redis的数据类型

    ​1.Redis的数据类型     Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(无序集合)及ZSet(有序集合)  2.String(字符串)    ...

  7. Redis常用数据类型及其存储结构(源码篇)

    一.SDS 1,SDS源码解读 sds (Simple Dynamic String),Simple的意思是简单,Dynamic即动态,意味着其具有动态增加空间的能力,扩容不需要使用者关心.Strin ...

  8. Redis 基础数据类型重温

    有一天你突然收到一条线上告警:Redis 内存使用率 85%.你吓坏了赶紧先进行扩容然后再去分析 big key.等你进行完这一系列操作之后老板叫你去复盘,期间你们聊到了业务的数据存储在 Redis ...

  9. Redis常用数据类型以及操作

    Redis常用数据类型以及操作 目录 Redis常用数据类型以及操作 一.String数据类型 1. SET/GET/APPEND/STRLEN 2. INCR/DECR/INCRBY/DECRBY ...

  10. Redis常用数据类型介绍、使用场景及其操作命令

    Redis常用数据类型介绍.使用场景及其操作命令 本文章同时也在cpper.info发布. Redis目前支持5种数据类型,分别是: 1.String(字符串) 2.List(列表) 3.Hash(字 ...

随机推荐

  1. Seata为什么效率高

    1. Seata为什么效率高 1.1. 应对面试官的解释 Seata的解决方案是两阶段提交的升级版,传统两阶段提交资源管理器(RM)放在数据库端,由数据库管理,需要数据库支持XA协议. 而Seata把 ...

  2. maven 学习---Maven依赖机制

    在 Maven 依赖机制的帮助下自动下载所有必需的依赖库,并保持版本升级. 案例分析 让我们看一个案例研究,以了解它是如何工作的.假设你想使用 Log4j 作为项目的日志.这里你要做什么? 1.在传统 ...

  3. RT-Thread点亮led

    下载默认工程 https://www.rt-thread.org/ 配置rtconfig.h #define STM32F103RE //修改成自己的板子 #define RT_HSE_VALUE 8 ...

  4. Flink使用SideOutPut替换Split实现分流

    以前的数据分析项目(版本1.4.2),对从Kafka读取的原始数据流,调用split接口实现分流. 新项目决定使用Flink 1.7.2,使用split接口进行分流的时候,发现接口被标记为deprac ...

  5. Spring Cloud Eureka详细说明

    之前学习了如何配置Eureka注册中心.消费者等,关于更详细的一些常用的配置在这里说明. 1.注册中心的自我保护模式 在我们调试Eureka的注册中心时,访问注册中心页面,常常会看见以下提示. 该提示 ...

  6. Java并行程序基础。

    并发,就是用多个执行器(线程)来完成一个任务(大任务)来处理业务(提高效率)的方法.而在这个过程中,会涉及到一些问题,所以学的就是解决这些问题的方法. 线程的基本操作: 1.创建线程:只需要new一个 ...

  7. 通过premake生成vs工程文件

    visual studio的工程视图,在引用外部目录时非常麻烦,这时候可以使用premake一键生成工程文件,自动配置好工程的各种属性,还有目录的组织结构. 示例:如下是一个c++的外部目录结构,我们 ...

  8. SDL2学习(一): 显示一张图片

    SDL是一个跨平台的多媒体库,它通过OpenGL和2D视频帧缓冲,提供了针对音频.视频.键盘.鼠标.控制杆及3D硬件的低级别的访问接口.这里使用较新的SDL2库. 1. 配置SDL开发环境 1.1 下 ...

  9. RegxUtils正则表达式工具类

    public class RegxUtils { //------------------常量定义 /** * Email正则表达式="^([a-z0-9A-Z]+[-|\\.]?)+[a- ...

  10. USACO Grass Planting

    洛谷 P3038 [USACO11DEC]牧草种植Grass Planting 洛谷传送门 JDOJ 2282: USACO 2011 Dec Gold 3.Grass Planting JDOJ传送 ...