Redis(三)数据类型
之前的文章中说了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(三)数据类型的更多相关文章
- Redis笔记(三)Redis的数据类型
前面说过,Redis的一大特性是支持丰富的数据类型, 这为更多的应用场景提供了可能. Redis有五种数据类型,包括string,list,set,sorted set和hash,注意,Redis的数 ...
- redis 小结三-数据类型
redis 的数据类型主要有五种 字符串(String) 哈希表(Hash) 列表(List) 集合(Set ) 有序集合(Sorted Set) 1. 字符串 一个 key 对应一个 value 该 ...
- Redis系列(二):Redis的数据类型及命令操作
原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...
- Redis的数据类型及其常用命令
快速入门Redis 首先安装redis: windows下安装redis Linux下安装redis 1. 什么是redis Redis属于nosql(非关系型数据库) 关系型数据库是基于关系表的数据 ...
- Redis的数据类型及相关操作命令
redis 基础内容 —— redis的数据类型及相关操作的Linux命令.所谓大厦千层基础承载,希望大家认真学习这一讲: 一.redis 的五大数据类型: 1.String(字符串): 2.List ...
- Redis之Redis的数据类型
1.Redis的数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(无序集合)及ZSet(有序集合) 2.String(字符串) ...
- Redis常用数据类型及其存储结构(源码篇)
一.SDS 1,SDS源码解读 sds (Simple Dynamic String),Simple的意思是简单,Dynamic即动态,意味着其具有动态增加空间的能力,扩容不需要使用者关心.Strin ...
- Redis 基础数据类型重温
有一天你突然收到一条线上告警:Redis 内存使用率 85%.你吓坏了赶紧先进行扩容然后再去分析 big key.等你进行完这一系列操作之后老板叫你去复盘,期间你们聊到了业务的数据存储在 Redis ...
- Redis常用数据类型以及操作
Redis常用数据类型以及操作 目录 Redis常用数据类型以及操作 一.String数据类型 1. SET/GET/APPEND/STRLEN 2. INCR/DECR/INCRBY/DECRBY ...
- Redis常用数据类型介绍、使用场景及其操作命令
Redis常用数据类型介绍.使用场景及其操作命令 本文章同时也在cpper.info发布. Redis目前支持5种数据类型,分别是: 1.String(字符串) 2.List(列表) 3.Hash(字 ...
随机推荐
- Scrum 冲刺第五篇
我们是这次稳了队,队员分别是温治乾.莫少政.黄思扬.余泽端.江海灵 一.会议 1.1 29号站立式会议照片: 1.2 昨天已完成的事情 团队成员 昨日计划完成的工作: 黄思扬 活动管理模块(前端) ...
- 素数、杨辉三角、封装结构和集合操作(15)——IPython使用和封装解构
IPython使用 帮助 ? ##Ipython的概述和简介 help(name) ##查询指定名称和帮助 obj? ##列出obj对象的详细信息 obj?? ##列出更详细的信息 特殊变量 _表示前 ...
- Skyshop.代码解析
MarmosetInput.cginc: Input结构定义: struct Input { #if defined(MARMO_PACKED_UV) || defined(MARMO_PACKED_ ...
- 07webpack--下载对应的css模块
<!--本节 loader配置处理css样式 在src下新建css文件夹 在css下创建index.css 在main.js这个入口文件中 引入js模块 和 css杨思表是不同的 在main.j ...
- spark写入空值到Oracle
转自:https://blog.csdn.net/qq_33792843/article/details/83750025 val nullStr = org.apache.spark.sql.fun ...
- eclipse配置JDK和设置编译版本的几种方法
eclipse配置JDK和设置编译版本的几种方法 2016-12-13 16:08 http://blog.csdn.net/gnail_oug/article/detail ...
- golang 登录
用户的两种登录模式 1.LDAP登录 //ldapLogin 通过LDAP登陆 func (m *Member) ldapLogin(account string, password string) ...
- 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" ...
- springboot2.1+redis多数据源的配置
springboot系列学习笔记全部文章请移步值博主专栏**: spring boot 2.X/spring cloud Greenwich. 由于是一系列文章,所以后面的文章可能会使用到前面文 ...
- [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 ...