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

前面说过,Redis的一大特性是支持丰富的数据类型,

这为更多的应用场景提供了可能。

Redis有五种数据类型,包括string,list,set,sorted set和hash,
注意,Redis的数据类型不支持嵌套。
下面学习一下这五种数据类型的特点和简单应用。

>>String 字符串

String 数据结构是简单的 key-value 类型,value 不仅可以是 String,也可以是数字(当数字类型用 Long 可以表示的时候encoding 就是整型,其他都存储在 sdshdr 当做字符串)。使用 Strings 类型,可以完全实现目前 Memcached 的功能,并且效率更高。还可以享受 Redis 的定时持久化(可以选择 RDB 模式或者 AOF 模式),操作日志及 Replication 等功能。

应用场景:
应用最广泛,Redis最基础的数据类型。

常用命令:
set,get,将字符串值value关联到key/返回key所关联的字符串值。
incr,将key中储存的数字值增一。
decr,将key中储存的数字值减一。
mset,同时设置一个或多个key-value对。
mget,返回所有(一个或多个)给定key的值。

>>Hash 哈希

很多时候我们需要存储一些对象数据信息,
比如用户信息,包括用户的昵称、年龄、性别等,如果使用String数据类型,
通常是将这些信息序列化后存储为一个JSON 格式的字符串,比如“lilei,18,man”。
如果更新这些信息,需要将字符串(JSON)取出来,进行反序列化,修改某一项的值,再序列化成字符串(JSON)存储回去。在数据的传输和处理时会造成很大的浪费,
这个时候散列数据类型就可以很好解决这个问题。Hash 结构可以直接修改某一项属性值。
实现方式:

常用命令:
HSET 给字段赋值,更新时可以直接覆盖
HGET 获得字段的值
HMSET,HMGET 给多个字段赋值(获得值)
HGETALL 获取键中所有字段和字段值
如,


1

2

3

4

5

6

7

redis> hmset tom age 18 gender male

OK

redis> hgetall tom

1) "age"

2) "18"

3) "gender"

4) "male"

  

>>List 列表

应用场景:
关注列表,粉丝列表,消息队列等。

实现方式:

list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

常用命令:
#将一个或多个值value插入到列表key的表头/移除并返回列表key的头元素
lpush,lpop
#将一个或多个值value插入到列表key的表尾(最右边)/移除并返回列表key的尾元素
rpush,rpop
#返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定
lrange
# LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。
BLPOP(阻塞版)

>>Set 集合

由一个或多个元素所构成的叫做集合。
集合中的元素有三个特征:确定性,互异性,无序性。集合和列表的区别在于列表中的元素有序且并不一定唯一。Redis还为集合提供了求交集、并集、差集等操作。

应用场景:
set对外提供的功能与list类似,但是set可以自动排重,当你需要存储一个列表数据,又不希望出现重复数据时,set是很好的选择。
set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

实现方式: 
set 的内部实现是一个value为null的HashMap, 实际就是通过计算hash的方式来快速排重的,操作set的时间复杂度始终为O(1)。

常用命令:
#向集合中添加一个或多个元素,返回成功加入的元素
SADD key member1 [member2...]
#删除一个或多个元素
SREM key member [member...]
#随机弹出一个元素
SPOP key
#集合间运算,差集运算
SDIFF key [key...]
#交集运算
SINTER key [key...]
#并集运算
SUNION key [key...]
#获得集合中的所有元素
SMEMBERS key
#判断元素是否在集合中
SISMEMBERS key member

操作实例:


1

2

3

4

5

6

7

8

redis>sadd myset a b c

(integer) 3

redis>smembers myset

1) "a"

2) "c"

3) "b"

redis>spop myset

"a"

>>Sorted set 有序集合

有序集合在集合类型的基础上,为每个元素都关联了一个分数,这样除了可以进行集合相关的操作,
还可以根据分数不同,进行排序等操作,有序集合中元素的分数可以是相同的。

应用场景:
以某个条件为权重,比如按顶的次数排序。
可以用Sorted Sets来做带权重的队列,
比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。

实现方式:
Redis sorted set的内部使用 HashMap 和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的分数。

有序集合和列表的区别:
list和sorted set中元素都是有序的,
列表类型是听过链表实现的,当元素增多时,访问中间元素速度会下降,
而有序集合是用HashMap和跳跃表(SkipList),不存在这个问题,但是有序集合的内存开销比列表要大。

常用命令:
#添加一个或多个成员到有序集合,或者如果它已经存在更新其分数
ZADD key score1 member1 [score2 member2] 
#由索引返回一个成员范围的有序集合
ZRANGE key start stop [WITHSCORES] 
#移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
ZREM
#返回有序集 key 的基数。
ZCARD 

 

时间: 2024-09-12 04:14:27

Redis笔记(三)Redis的数据类型的相关文章

Redis教程(三):List数据类型_Lua

一.概述:       在Redis中,List类型是按照插入顺序排序的字符串链表.和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素.在插入时,如果该键并不存在,Redis将为该键创建一个新的链表.与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除.List中可以包含的最大元素数量是4294967295.       从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条

NoSQL之Redis(三) --- Redis在项目中的运用

NoSQL之Redis(三) --- Redis在项目中的运用            又是一个喧闹的新年,少了的不是年味,变了的是人们的内心.难得的假期静下心来回顾上一年,展望下一年.思考,总结,陪陪家人是否更值得去做?养精蓄锐,是不是又能更好迎接来年的挑战?年轻不是放纵的资本,需要的事更好的珍惜眼前的时光.            本文笔者会简单的描述一下Redis在"jrkj"这个项目中的哪些场景中使用的,以及是如何使用的.            应用场景一            首

Redis笔记(一)Redis简介

关于Redis Redis是一款开源的高性能键值对数据库, 最初的作者是意大利的Salvatore Sanfilippo, 他的github是 antirez ,Redis的源码同样托管在Git上:https://github.com/antirez/redis. 目前,Vmware在资助着redis项目的开发和维护. Redis的特性 键值对如dict["key"]="value"中,"key"是键名,"value"是键值,

redis笔记

redis笔记 什么是redis 意大利的老司机内部用mysql不能满足高并发的请求,为了解决问题,该司机申请的内部项目,诞生了redis,用C语言开发的高性能的键值对缓存数据服务~ 支持的数据结构 string Set Hash sortSet List redis目的 数据据库缓存集群,保持并发业务的高可用,高速响应 基础知识 Redis内置16384个hash槽,crc16算法来确定请求该访问哪一个槽.->crc16根据客户端的key计算一个结果,对16384取余,确定区间,然后确定该请求

Redis学习笔记~StackExchange.Redis实现分布式Session

对于多WEB的环境现在已经是必须的了,很难想像一台WEB服务器面对百万并发的响应,所以,我们需要多台WEB服务器集群合作,来缓解这种高并发,高吞吐的场景,而对于多WEB的场景又会有个问题出现,即session存储的问题,如一个用户登陆后,把一个状态信息存储到当前WEB服务器的session里,而你请求其它页面时,很可能就被路由到另一台服务器了,这时,session也就丢了,而对于这种情况,有人把redis这个存储中间件想了起来,对它进行了封装,就有了今天基于redis的session共享机制.

Redis笔记(五)Redis的事务

关系型数据库的事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消. Atomic(原子性):  一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节. Consistency(一致性): 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态. Isolation(隔离性):  一个事务的执行不能其它事务干扰.事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性. Du

Redis的三种启动方式

安装 Shell代码 收藏代码 tar zxvf redis-2.8.9.tar.gz cd redis-2.8.9 直接make 编译 make 可使用root用户执行make install,将可执行文件拷贝到/usr/local/bin目录下.这样就可以直接敲名字运行程序了. make install 启动 Shell代码 收藏代码 加上&号使redis以后台程序方式运行 ./redis-server & 检测 Shell代码 收藏代码 检测后台进程是否存在 ps -ef |grep

redis之(十三)redis的三种启动方式

Part I. 直接启动 下载 官网下载 安装 tar zxvf redis-2.8.9.tar.gz cd redis-2.8.9 #直接make 编译 make #可使用root用户执行`make install`,将可执行文件拷贝到/usr/local/bin目录下.这样就可以直接敲名字运行程序了. make install 启动 #加上`&`号使redis以后台程序方式运行 ./redis-server & 检测 #检测后台进程是否存在 ps -ef |grep redis #检测

NoSQL和Redis简介及Redis在Windows下的安装和使用教程_Redis

NoSQL简介 介绍redis前,我想还是先认识下NoSQL,即not only sql, 是一种非关系型的数据存储,key/value键值对存储.现有Nosql DB 产品: Redis/MongoDB/Memcached/Hbase/Cassandra/ Tokyo Cabinet/Voldemort/Dynomite/Riak/ CouchDB/Hypertable/Flare/Tin/Lightcloud/ KiokuDB/Scalaris/Kai/ThruDB, 等等~~~ 为什么需要

NoSQL数据库之Redis数据库:Redis的介绍与安装部署

 NoSQL(NoSQL = Not Only SQL),它指的是非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显的力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展.   NoSQL的特点: 特点一: 是以key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如说遵循SQL标准.ACID属性.表结构等等