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(字 ...
随机推荐
- 玄学 npm报错记录
刚开始是版本原因npm报错,ok卸载重装就可以了, 后面报错 npm ERR! code ENOGIT npm ERR! No git binary found in $PATH npm ERR! n ...
- React Router 4.0 体验
React Router 4.0 (以下简称 RR4) 已经正式发布,它遵循React的设计理念,即万物皆组件.所以 RR4 只是一堆 提供了导航功能的组件(还有若干对象和方法),具有声明式(声明式编 ...
- swift(三)字典数组操作
//1.数组的概念和定义 var array = [,,,] var array1:Array = [,,,] var array2:Array<Int> = [,,,]; var arr ...
- Vue-组件模板抽离的写法
VUE的模板分离写法. 1.第一种(不常用) <script type="text/x-template" id="myCpm"> <div& ...
- X264-编码模块和NAL打包输出
在上一篇介绍了编码器的VCL编码操作,分析了函数x264_slice_write().函数x264_slice_write()里有四个关键模块,分别是宏块分析模块.宏块编码模块.熵编码模块和滤波模块, ...
- 记一条复杂的PHP中写的关于查询的mysql语句
$sql="select p.*,q.md from xz_laptop as p inner join xz_laptop_pic as q on p.lid=q.lid title li ...
- bit和byte的区别是什么?
bit(位/比特):计算机运算的基础单位: byte(字节):计算机中文件大小的基本计量单位. 转换关系:8 bit = 1 Byte1024 Byte = 1 KB1024 KB = 1 MB102 ...
- centos7 安装gitlab及简单配置
1.安装 wget -O gitlab.rpm https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-11.11.3 ...
- jetbrains 系列编辑器
下载 webstorm下载地址:https://www.jetbrains.com/webstorm/download/previous.html idea下载地址:https://www.jetbr ...
- vue报错 Uncaught (in promise) NavigationDuplicated {_name:""NavigationDuplicated"... 的解决方法
在进行跳转的时候报错 app.js:87499 Uncaught (in promise) NavigationDuplicated?{_name: "NavigationDuplicate ...