Redis数据类型详解

Redis键/值介绍

Redis key值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如“foo”的简单字符串到一个JPG文件的内容都可以。空字符串也是有效key值。

key规则:

  • 太长的键值不是个好主意,例如1024字节的键值就不是个好主意,不仅因为消耗内存,而且在数据中查找这类键值的计算成本很高。
  • 太短的键值通常也不是好主意,如果你要用“u:1000:pwd”来代替
  • 最好坚持一种模式。例如:"object-type:id:field"就是个不错的注意,像这样“user:1000:password”。或者一个键值对的字段名中加上一个点,就想这样“comment:1234:reply.to”。

数据类型:

String字符串类型

List列表数据类型

集合(Sets)类型

有序集合(Sorted Sets)类型

Hash类型

1.String字符串类型

这是Redis最简单的数据类型之一。如果只使用这种数据类型,那么redis就是一个持久化的memcached服务器当然redis对string类型的功能比memcached还是多很多的

常规的String字符串类型(key value):

127.0.0.1:> set wk >.>haoshuai      #存入数据  key为wk 数据为>.>haoshuai
OK
127.0.0.1:> get wk             #查数据,get+key值查看
">.>haoshuai"

value值可以是任何类型的字符串(包括二进制数据),例如你可以在一个键下保存一个jpg图片。但值的长度不能超过1GB

String类型也可以用来存储数字,并支持对数字的加减操作:

set id         #设置键为id 值为1
incr id      #自增1 id变为2
incrby id    #自增指定数值5 id变为7  
decr id      #自减1 id变为6
decrby id5    #自减指定数值5 id变为1

为key设置新值并且返回原值

127.0.0.1:> set user01 zhangsan   #设置新key-value
OK
127.0.0.1:> get user01
"zhangsan"
127.0.0.1:> getset user01 wangwu #设置新数据并返回旧数据
"zhangsan"
127.0.0.1:> getset user01 liliu #设置新数据并返回旧数据
"wangwu"
127.0.0.1:> getset user01 gongli #设置新数据并返回旧数据
"liliu"
127.0.0.1:> get user01
"gongli"

String类型还支持批量读写操作

127.0.0.1:> mset name zhangsan age
OK
127.0.0.1:> mget name age
) "zhangsan"
) ""

string类型还支持对其部分的修改和获取操作

127.0.0.1:> set images flower
127.0.0.1:> append images .jpg #追加字符串
127.0.0.1:> get images
"flower.jpg"

2.List列表类型

列表list的用途:

list可被用来实现聊天系统。还可以作为不同进程间传递消息的队列。关键是,你可以每次都以原先添加的顺序访问数据。这不需要任何SQLORDER操作,将会非常快,也会很容易扩展到百万级别的规模。

在评级系统中,比如社会化新闻网站reddit.com,你可以把每个新提交的链接添加到一个list,用LRANGE可简单的对结果分页。

在博客引擎实现中,你可为每篇日志设置一个list,在该list中推入进博客评论,等等

向Redis list压入ID而不是实际的数据

127.0.0.1:> lpush students "zhangsan"   #将元素“zhangsan”放在students列表的最左边
127.0.0.1:> lpush students "wangwu"   #将元素“wangwu”插入列表的最左边
127.0.0.1:> lpush students "liliu"    #将元素“liliu”插入列表的最左边
lrange students               #查看序列是0到2的元素
) "liliu"
) "wangwu"
) "zhangsan"
rpush students "wangyue"           #将元素wangyue插入列表的最右边
lrange students                #查看序列是0到3的元素
) "liliu"
) "wangwu"
) "zhangsan"
) "wangyue"
llen students #查看列表元素的个数
lpop students #移除最左边的元素值
rpop students #移除最右边的元素值
127.0.0.1:> rpush students zhangsan
127.0.0.1:> rpush students zhangsan
127.0.0.1:> lrange students
) "wangwu"
) "zhangsan"
) "zhangsan"
) "zhangsan"
127.0.0.1:> lrem students "zhangsan" #删除列表里是“zhangsan”的元素,删除两次(从左向右删)
127.0.0.1:> lrange students
) "wangwu"
) "zhangsan"
127.0.0.1:> lrem students "zhangsan" #删除列表里的元素zhangsan一次
127.0.0.1:> lrem students "zhangsan" #清空列表所有的zhangsan元素
127.0.0.1:> lpush students a b c d  #左插入元素abcd
127.0.0.1:> lrange students
) "d"
) "c"
) "b"
) "a"
127.0.0.1:> linsert students before b xxxx #在元素b的前边插入元素xxxx
127.0.0.1:> lrange students
) "d"
) "c"
) "xxxx"
) "b"
) "a"
127.0.0.1:> linsert students after b xxxx #在元素b的后边插入元素xxxx
127.0.0.1:> lrange students
) "d"
) "c"
) "xxxx"
) "b"
) "xxxx"
) "a"

3.集合(Sets)类型

Redis集合是未排序的集合,其元素是二进制安全的字符串。SADD命令可以向集合添加一个新元素。和sets相关的操作也有许多,比如检测某个元素是否存在,以及实现交集,并集,差集等等。

edis能够将一系列不重复的值存储成一个集合

127.0.0.1:> sadd users laoda    #向集合users里添加一个元素“laoda”
127.0.0.1:> sadd users laoer laosan #向结合users里添加两个元素laoer,laosan
127.0.0.1:> smembers users #查看集合里的所有元素
) "laosan" #可以看到集合里的元素是无序的
) "laoda"
) "laoer"
#我们向集合中添加了三个元素,并让Redis返回所有元素。现在让我们看一下某个元素是否存在于集合中
127.0.0.1:> sismember users laoda #查看元素laoda是否存在于集合users中
(integer) #存在
127.0.0.1:> sismember users laoer #查看元素laoer是否存在于集合users中
(integer) #存在
127.0.0.1:> sismember users laosan #查看元素laosan是否存在于集合users中
(integer) #存在
127.0.0.1:> sismember users laosi #查看元素laosi是否存在于集合users中
(integer) #不存在

“laoda”是这个集合的成员,而“laosi”不是。集合特别适合表现对象之间的关系。例如用Redis集合可以很容易实现标签功能。

下面是一个简单的方案:对每个想加标签的对象,用一个标签ID集合与之关联,并且对每个已有的标签,一组对象ID与之关联。

例如,假设我们的新闻ID1000被加了三个标签tag1,2,5和77,就可以设置下面两个集合:

sadd news::tags
sadd news::tags
sadd news::tags
sadd news::tags
sadd tag::objects
sadd tag::objects
sadd tag::objects
sadd tag::objects
#要获取一个对象的所有标签,我们只需要:
#获取ID号为1000的所有新闻的题目
smembers news::tags #获取集合为news:1000:tags的所有元素
) "" #新闻标题
) "" #新闻标题
) "" #新闻标题
) "" #新闻标题
#查询某个标签的具体内容,我们只需要:
#获取某个新闻标题的具体内容
smembers tag::objects #获取集合为tag:5:objects的所有元素
) "" #新闻内容

而有些看上去并不简单的操作仍然能使用相应的Redis命令轻松实现。例如我们也许想获得一份同时拥有标签1,2,10和27的对象列表。则可以用SINTER命令来做,他可以在不同集合之间取出交集。因此为达目的我们只需:

sadd tag::objects        #向集合tag:1:objects里添加元素“500”
smembers tag::objects #查看集合tag:1:objects里的所有元素
) ""
) ""
smembers tag::objects #查看集合tag:2:objects里的所有元素
) ""
sinter tag::objects tag::objects tag::objects tag::objects #求集合tag:1:objects ...tag:27:objects里的所有元素的交集
1) "1000"

4 有序集合(Sorted Sets)类型

Sorted Sets和Sets结构相似,不同的是存在Sorted Sets中的数据会有一个score属性,并会在写入时就按这个score拍好序。

#向一个有序集合里添加元素
127.0.0.1:> ZADD days mon #days是有序集合名,0是序号,mon是值
(integer)
127.0.0.1:> ZADD days tue
(integer)
127.0.0.1:> ZADD days web
(integer)
127.0.0.1:> ZADD days thu
(integer)
127.0.0.1:> ZADD days fri
(integer)
127.0.0.1:> ZADD days sat
(integer)
127.0.0.1:> ZADD days sun
(integer)
127.0.0.1:> zrange days #查看集合索引0到6的元素
) "mon"
) "tue"
) "web"
) "thu"
) "fri"
) "sat"
) "sun"
#从上面我们可以看出,ZADD创建的集合是有序集合。
#查看有序集合days的具体值的排序
127.0.0.1:> zscore days mon
""
127.0.0.1:> zscore days web
""
127.0.0.1:> zscore days fri
""
root@redis-master ~]# redis-cli -a yunjisuan
127.0.0.1:> zscore days mon
""
127.0.0.1:> zscore days web
""
127.0.0.1:> zscore days fri
""
127.0.0.1:> zcount days
(integer)
127.0.0.1:> ZRANGEBYSCORE days
) "thu"
) "fri"
) "sat"
) "sun"
  • 集合是使用频率很高的数据类型,但是...对许多问题来说他们也有点太不讲顺序了;因此Redis1.2引入了有序集合。它和集合非常相似,也是二进制安全的字符串集合,但是这次带有关联的score,以及一个类似LRANGE的操作可以返回有序元素,此操作只能作用于有序集合,它就是,ZRANGE命令。
  • 基本上有序集合从某种程度上说是SQL世界的索引在Redis中的等价物。例如在上面提到的reddit.com例子中,并没有提到如何根据用户投票和时间因素将新闻组合生成首页。我们将看到有序集合如何解决这个问题,但最好先从更简单的事情开始,阐明这个高级数据类型是如何工作的。让我们添加几个黑客,并将他们的生日作为“score”。
127.0.0.1:> zadd hackers  "1940-Alan Kay"
(integer)
127.0.0.1:> zadd hackers "1953-Richard Stallman"
(integer)
127.0.0.1:> zadd hackers "1965-Yukihiro Matsumoto"
(integer)
127.0.0.1:> zadd hackers "1916-Claude Shannon"
(integer)
127.0.0.1:> zadd hackers "1969-Linus Torvalds"
(integer)
127.0.0.1:> zadd hackers "1912-Alan Turing"
(integer)

对有序集合来说,按生日排序返回这些黑客易如反掌,因为他们已经是有序的。有序集合是通过一个dual-ported数据结构实现的,它包含一个精简的有序列表和一个hash table,因此添加一个元素的时间复杂度是O(log(N))。这还行,但当我们需要访问有序的元素时,Redis不必再做任何事情,它已经是有序的了:

127.0.0.1:> zadd hackers  "1940-Alan Kay"
(integer)
127.0.0.1:> zadd hackers "1953-Richard Stallman"
(integer)
127.0.0.1:> zadd hackers "1965-Yukihiro Matsumoto"
(integer)
127.0.0.1:> zadd hackers "1916-Claude Shannon"
(integer)
127.0.0.1:> zadd hackers "1969-Linus Torvalds"
(integer)
127.0.0.1:> zadd hackers "1912-Alan Turing"
(integer)
#利用zrange进行排序查询
127.0.0.1:> zrange hackers
) "1912-Alan Turing"
) "1916-Claude Shannon"
) "1940-Alan Kay"
) "1953-Richard Stallman"
) "1965-Yukihiro Matsumoto"
) "1969-Linus Torvalds"
#利用zrevrange进行反向查询
127.0.0.1:> zrevrange hackers -
) "1969-Linus Torvalds"
) "1965-Yukihiro Matsumoto"
) "1953-Richard Stallman"
) "1940-Alan Kay"
) "1916-Claude Shannon"
) "1912-Alan Turing"

5 Hash类型

Redis能够存储key对多个属性的数据(比如user1,uname user1.passwd)

#存储一个hash类型test,他的属性是name,属性数据是yunjisuan
127.0.0.1:> hset test name yunjisuan
(integer)
#存储一个hash类型test,他的属性是age,属性数据是35
127.0.0.1:> hset test age
(integer)
#存储一个hash类型test,他的属性是sex,属性数据是non
127.0.0.1:> hset test sex nan
(integer)
#查看hash类型test的所有属性的值
127.0.0.1:> hvals test
) "yunjisuan"
) ""
) "nan"
#查看hash类型test的所有属性及属性所对应的值
127.0.0.1:> hgetall test
) "name"
) "yunjisuan"
) "age"
) ""
) "sex"
) "nan"

开启redis的订阅功能

#开启redis的订阅功能
redis-cli
127.0.0.1:> subscribe yunjisuan #开启频道名:yunjisuan的订阅功能,可开启多个窗口进行订阅 #对频道进行内容推送 只要在推送端推送,订阅端就能看到
redis-cli
127.0.0.1:> publish yunjisuan 'welcome' #向频道yunjisuan推送welcome
(integer) #推送成功的人数
127.0.0.1:> publish yunjisuan '很高兴'
(integer)
127.0.0.1:> publish yunjisuan 'welcome'
(integer)

redis数据类型及订阅操作的更多相关文章

  1. Redis数据类型之列表操作

    redis 目录: 1.自动分配(redis) - 批量导入 2.微信自动绑定 3.django的ORM做不了的操作,怎么自定义操作数据库 extra ’ 4.报表 公司每个月销售的业绩 5.权限 = ...

  2. Redis数据类型和操作

    <"Java技术员"成长手册>,包含框架.存储.搜索.优化.分布式等必备知识,都收集在GitHub JavaEgg ,N线互联网开发必备技能兵器谱,欢迎指导 Redis ...

  3. redis教程(一)-----redis数据类型、基本命令、发布订阅以及持久化

    简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMwa ...

  4. 文成小盆友python-num12 Redis发布与订阅补充,python操作rabbitMQ

    本篇主要内容: redis发布与订阅补充 python操作rabbitMQ 一,redis 发布与订阅补充 如下一个简单的监控模型,通过这个模式所有的收听者都能收听到一份数据. 用代码来实现一个red ...

  5. Redis五大数据类型的常用操作

    在上一篇博文<centos安装redis>中,已经详细介绍了如何在centos上安装redis,今天主要介绍下Redis五大数据类型及其五大数据类型的相关操作. Redis支持五种数据类型 ...

  6. 缓存数据库-redis数据类型和操作(list)

    转: 狼来的日子里! 奋发博取 缓存数据库-redis数据类型和操作(list) 一:Redis 列表(List) Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素导列表的头部( ...

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

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

  8. redis(Springboot中封装整合redis,java程序如何操作redis的5种基本数据类型)

    平常测试redis操作命令,可能用的是cmd窗口 操作redis,记录一下 java程序操作reids, 操作redis的方法 可以用Jedis ,在springboot 提供了两种 方法操作 Red ...

  9. Linux+Redis实战教程_day02_3、redis数据类型_4、String命令_5、hash命令_6、java操作redis数据库技术

    3. redis数据类型[重点] redis 使用的是键值对保存数据.(map) key:全部都是字符串 value:有五种数据类型 Key名:自定义,key名不要过长,否则影响使用效率 Key名不要 ...

随机推荐

  1. 第二章、Django以及数据库的配置

    目录 第二章.Django以及数据库的配置 一.小白必会三板斧 二.静态文件配置 三.form表单 action和method参数可以写的形式 四.request对象及方法 五.django连接数据库 ...

  2. Linux学习笔记(五)Linux常用命令:压缩命令

    Linux中最常见的5中压缩格式: zip gz bz2 tar.gz tar.bz2 一..zip压缩命令 压缩文件 zip [压缩文件名] [源文件] 例如: zip zijeak.zip zij ...

  3. Linux学习笔记(三)Linux常用命令:链接命令和文件查找命令

    一.链接命令 ln -s [原文件] [目标文件] (link) -s意为创建软连接 硬链接和软连接 硬链接的特点: (1)拥有相同的 i 结点和block块,可以看作是同一个文件 (2)可以通过 i ...

  4. Hadoop_28_MapReduce_自定义 inputFormat

    1. 自定义inputFormat 1.1.需求: 无论hdfs还是mapreduce,对于小文件都有损效率,实践中,又难免面临处理大量小文件,此时就需要有相应解决方案; 1.2.分析: 小文件的优化 ...

  5. linux常用的操作命令

    ---恢复内容开始--- 最近换了工作之后,需要管理linux服务器的日常运行和维护,自然linux命令是少不了的,切换目录,vim操作等的简单的操作就不说了,有些时候还需要查看日志和监控服务器启动进 ...

  6. 接口自动化平台——httprunnermanager

    Windows 环境搭建 1. 下载安装pip install httprunner==1.4.2hrun -V #1.4.2har2case -V #0.1.8 2. httprunnermanag ...

  7. run zabbix with docker

    #!/bin/bashdocker run --name some-zabbix-server-mysql -p 10051:10051 --net=host -e DB_SERVER_HOST=&q ...

  8. Qt disconnect函数

    1. 介绍disconnect()用法 disconnect()有3种用法,其原型如下: bool QObject::disconnect(const QObject * sender, const ...

  9. log4j.properties通用配置

    一.Log4j的配置文件分类Log4j支持两种配置文件格式,一种是XML格式的文件,一种是properties(key=value)文件,其中properties格式的配置文件最为常用,其有一个固定的 ...

  10. HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3

    /* HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3 题意: 给出排列 a[N],求所有区间的 ...