之前的文章中说了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. Scrum 冲刺第五篇

    我们是这次稳了队,队员分别是温治乾.莫少政.黄思扬.余泽端.江海灵 一.会议 1.1  29号站立式会议照片: 1.2  昨天已完成的事情 团队成员 昨日计划完成的工作: 黄思扬 活动管理模块(前端) ...

  2. 素数、杨辉三角、封装结构和集合操作(15)——IPython使用和封装解构

    IPython使用 帮助 ? ##Ipython的概述和简介 help(name) ##查询指定名称和帮助 obj? ##列出obj对象的详细信息 obj?? ##列出更详细的信息 特殊变量 _表示前 ...

  3. Skyshop.代码解析

    MarmosetInput.cginc: Input结构定义: struct Input { #if defined(MARMO_PACKED_UV) || defined(MARMO_PACKED_ ...

  4. 07webpack--下载对应的css模块

    <!--本节 loader配置处理css样式 在src下新建css文件夹 在css下创建index.css 在main.js这个入口文件中 引入js模块 和 css杨思表是不同的 在main.j ...

  5. spark写入空值到Oracle

    转自:https://blog.csdn.net/qq_33792843/article/details/83750025 val nullStr = org.apache.spark.sql.fun ...

  6. eclipse配置JDK和设置编译版本的几种方法

    eclipse配置JDK和设置编译版本的几种方法  2016-12-13 16:08             http://blog.csdn.net/gnail_oug/article/detail ...

  7. golang 登录

    用户的两种登录模式 1.LDAP登录 //ldapLogin 通过LDAP登陆 func (m *Member) ldapLogin(account string, password string) ...

  8. angularjs 运行时报错ERROR in node_modules/rxjs/internal/types.d.ts(81,44): error TS1005: ';' expected. node_modules/rxjs/internal/types.d.ts(81,74): error TS1005: ';' expected. node_modules/rxjs/internal/t

    解决方法: 在package.json文件里面 修改 "rxjs": "^6.0.0" 为 "rxjs": "6.0.0" ...

  9. springboot2.1+redis多数据源的配置

    springboot系列学习笔记全部文章请移步值博主专栏**: spring boot 2.X/spring cloud Greenwich.    由于是一系列文章,所以后面的文章可能会使用到前面文 ...

  10. [LeetCode] 685. Redundant Connection II 冗余的连接之二

    In this problem, a rooted tree is a directed graph such that, there is exactly one node (the root) f ...