文档章节

《Redis IN ACTION》-【第一篇】初识Redis

u
 uetucci
发布于 2017/06/09 10:06
字数 2486
阅读 3
收藏 0

1.1 Redis简介

Redis是一个速度非常快的非关系数据库(non-relational database),它可以存储(key)与5种不同类型的值(value)之间的映射(mapping),可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展写性能。

1.1.1 Redis与其他数据库和软件的对比

名称 类型 数据存储选项 查询类型 附加功能
Redis 使用内存存储(in-memory)的非关系数据库 字符串、列表、集合、散列表、有序集合 每种数据类型都有自己的专属命令,另外还有批量操作(bulk operation)和不完全(partial)的事务支持 发布与订阅,主从复制(master/slave replication),持久化,脚步(存储过程 stored proceduce)
memcached 使用内存存储的键值缓存 键值之间的映射 创建命令、读取命令、更新命令、删除命令以及其他命令 为提升性能而设的多线程服务器
MySQL 关系数据库 每个数据库可以包含多个表,每个表可以包含多个行;可以处理多个表的视图(view);支持空间(spatial)和第三方扩展 SELECT、INSERT、UPDATE、DELETE、函数、存储过程 支持ACID性质(需要使用InnoDB),主从复制和主主复制(master/master replication)
PostgreSQL 关系数据库 每个数据库可以包含多个表,每个表可以包含多个行;可以处理多个表的视图;支持空间和第三方扩展;支持可定制类型 SELECT、INSERT、UPDATE、DELETE、内置函数、自定义的存储过程 支持ACID性质,主从复制,由第三方支持的多主复制(multi-master replication)
MongoDB 使用硬盘存储(on-disk)的非关系文档存储 每个数据库可以包含多个表,每个表可以包含多个无schema(schema-less)的BSON文档 创建命令、读取命令、更新命令、删除命令、条件查询命令等 支持map-reduce操作,主从复制,分片,空间索引(spatial index)

1.1.2 附加特性

Redis拥有两种不同形式的持久化方法:

  • 第一种持久化方法为时间点存储(point-in-time dump),转储操作既可以在“指定时间段内由指定数量的写操作执行”这一条件被满足时执行,又可以通过调用两条转储到硬盘(dump-to-disk)命令中的任何一条来执行;
  • 第二种持久化方法将所有修改来数据库的命令写入一个只追加(append-only)文件里面,用户可以根据数据的重要程度,将只追加写入设置为从不同步(sync)、每秒同步一次或者每写入一个命令就同步一次。

Redis实现了主从复制特性:执行复制的从服务器会连接上主服务器,接受主服务器发送的整个数据库的初始副本(copy);之后主服务器执行的写命令,都会被发送给所有连接着的从服务器去执行,从而实时地更新从服务器的数据集。

1.1.3 使用Redis的理由

使用Redis来解决问题,不仅可以让代码变得更简单、更易懂、更易维护,而且还可以使代码的运行速度更快(因为用户不需要通过读取数据库来更新数据)。除此之外,在其他许多情况下,Redis的效率和易用性也比关系数据库要好得多。

1.2 Redis数据结构简介

Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为STRING(字符串)、LIST(列表)、SET(集合)、HASH(散列)和ZSET(有序集合)。有一部分Redis命令对于这5种结构都是通用的,如DEL、TYPE、RENAME等;有一部分Redis命令只能对特定的一种或者两种结构使用。

结构类型 结构存储的值 结构的读写能力
STRING 可以是字符串、整数或者浮点数 对整个字符串或者字符串的其中一部分执行操作;对整数和浮点数执行自增(increment)或者自减(decrement)操作
LIST 一个链表,链表上的每个节点都包含了一个字符串 从链表的两端推入或者弹出元素;根据偏移量对链表进行修建(trim);读取单个或者多个元素;根据值查找或者移除元素
SET 包含字符串的无序收集器(unordered collection),并且被包含的每个字符串都是独一无二、各不相同的 添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素
HASH 包含键值对的无序散列表 添加、获取、移除单个键值对;获取所有键值对
ZSET 字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定 添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素

1.2.1 Redis中的字符串

Redis的字符串和其他编程语言或者其他键值存储提供的字符串非常相似。

命令 行为
GET 获取存储在给定键中的值
SET 设置存储在给定键中的值
DEL 删除存储在给定键中的值(这个命令可以用于所有类型)
$ redis-cli
redis 127.0.0.1:6379> set hello world
OK
redis 127.0.0.1:6379> get hello
"world"
redis 127.0.0.1:6379> del hello
(integer) 1
redis 127.0.0.1:6379> get hello
(nil)
redis 127.0.0.1:6379>

1.2.2 Redis中的列表

一个列表结构可以有序地存储多个字符串。

命令 行为
RPUSH 将给定值推入列表的右端
LRANGE 获取列表在给定范围上的所有值
LINDEX 获取列表在给定位置上的单个元素
LPOP 从列表的左端弹出一个值,并返回被弹出的值
redis 127.0.0.1:6379>rpush list-key item
(integer) 1
redis 127.0.0.1:6379>rpush list-key item2
(integer) 2
redis 127.0.0.1:6379>rpush list-key item
(integer) 3  //在向列表推入新元素之后,该命令会返回列表当前的长度 
redis 127.0.0.1:6379>lrange list-key 0 -1
1) "item"
2) "item2"
3) "item"
redis 127.0.0.1:6379>lindex list-key 1
"item2"
redis 127.0.0.1:6379>lpop list-key
"item"
redis 127.0.0.1:6379>lrange list-key 0 -1
1) "item2"
2) "item"
redis 127.0.0.1:6379>

1.2.3 Redis的集合

Redis的集合和列表都可以存储多个字符串,他们之间的不同在于,列表可以存储多个相同的字符串,而集合则通过使用散列表来保证自己存储的每个字符串都是各不相同的。

因为Redis的集合使用无序(unordered)的方式存储元素,所有用户不能想使用列表那样,将元素推入集合的某一端,或者从集合的某一端弹出元素。

命令 行为
SADD 将给定元素添加到集合
SMEMBERS 返回集合包含的所有元素
SISMEMBER 检查给定元素是否存在于集合中
SREM 如果给定的元素存在于集合中,那么移除这个元素
redis 127.0.0.1:6379>sadd set-key item
(integer) 1
redis 127.0.0.1:6379>sadd set-key item2
(integer) 1
redis 127.0.0.1:6379>sadd set-key item3
(integer) 1
redis 127.0.0.1:6379>sadd set-key item
(integer) 0 // 在尝试将一个元素添加到集合的时候,命令返回1表示这个元素被成功地添加到了结合里面,而返回0则表示这个元素已经存在于集合中。
redis 127.0.0.1:6379>smembers set-key 
1) "item"
2) "item2"
3) "item3"
redis 127.0.0.1:6379>sismember set-key item4
(integer) 0
redis 127.0.0.1:6379>sismember set-key item
(integer) 1
redis 127.0.0.1:6379>srem set-key item2
(integer) 1
redis 127.0.0.1:6379>srem set-key item2
(integer) 0 //在使用命令移除集合中的元素时,命令会返回被移除元素的数量。
redis 127.0.0.1:6379>smembers set-key 
1) "item"
2) "item3"
redis 127.0.0.1:6379>

1.2.4 Redis的散列

Redis的散列可以存储多个键值对之间的映射。

命令 行为
HSET 在散列里面关联给定的键值对
HGET 获取指定散列键的值
HGETALL 获取散列包含的所有键值对
HDEL 如果给定键存在于散列里面,那么移除这个键
redis 127.0.0.1:6379>hset hash-ket sub-key1 value1
(integer) 1
redis 127.0.0.1:6379>hset hash-ket sub-key2 value2
(integer) 1
redis 127.0.0.1:6379>hset hash-ket sub-key1 value1
(integer) 0 // 在尝试添加键值对到散列的时候,命令会返回一个值来表示给定的键是否已经存在于散列里面。
redis 127.0.0.1:6379>hgetall hash-key
1) "sub-key1"
2) "value1"
3) "sub-key2"
4) "value2"
redis 127.0.0.1:6379>hdel hash-key sub-key2
(integer) 1
redis 127.0.0.1:6379>hdel hash-key sub-key2
(integer) 0
redis 127.0.0.1:6379>hget hash-key sub-key1
"value1"
redis 127.0.0.1:6379>hgetall hash-key
1) "sub-key1"
2) "value1"

1.2.5 Redis的有序集合

有序集合和散列一样,都用于存储键值对:有序集合的键被称为成员(member),每个成员都是个不相同的;而有序集合的值被称为分值(score),分值必须为浮点数。有序集合是Redis里面唯一一个既可以根据成员访问元素(这一点和散列一样),又可以根据分值以及分值的排序来访问元素的结构。

命令 行为
ZADD 将一个带有给定分值的成员添加到有序集合里面
ZRANGE 根据元素在有序排列中所处的位置,从有序集合里面获取多个元素
ZRANGEBYSCORE 获取有序集合在给定分值范围内的所有元素
ZREM 如果给定成员存在于有序集合,那么移除这个成员
redis 127.0.0.1:6379>zadd zest-key 728 member1
(integer) 1
redis 127.0.0.1:6379>zadd zest-key 982 member0
(integer) 1
redis 127.0.0.1:6379>zadd zest-key 982 member0
(integer) 0
redis 127.0.0.1:6379>zrange zest-key 0 -1 withscores
1) "member1"
2) "728"
3) "member0"
4) "982"
redis 127.0.0.1:6379>zrangebyscore zest-key 0 800 withscores
1) "member1"
2) "728"
redis 127.0.0.1:6379>orem zest-key member1
(integer) 1
redis 127.0.0.1:6379>orem zest-key member1
(integer) 0
redis 127.0.0.1:6379>zrange zest-key 0 -1 withscores
1) "member0"
2) "982"

© 著作权归作者所有

u
粉丝 0
博文 65
码字总数 103136
作品 0
深圳
程序员
私信 提问
《redis in action》笔记

motivation get familiar with python go over redis's commands & be practised cases dive deeper 初识redis 工具会极大地改变人们解决问题的方式 四 数据安全与性能保障 mac 下redis配置文......

holysu
2017/09/01
0
0
初识Redis

一、概述: 在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该...

丑的想整容
2016/10/15
621
0
初识redis及实现session共享

1.Redis介绍及安装 Redis是当前比较热门的NOSQL系统之一, 它是一个key-value存储系统,和memcached类似,但在很大程度上补足了memcached的不足,它支持存储的value类型相对较多,包括String,Li...

陈小扁
2016/05/03
138
0
Redis探索之旅(1)- Redis初识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/andamajing/article/details/52422369 Redis,其实对我来说并不是一个新鲜的事务,早在几年前刚工作时就已经接...

DreamMakers
2016/09/03
0
0
【SpringBoot2.0系列08】SpringBoot之redis数据缓存管理

【SpringBoot2.0系列01】初识SpringBoot 【SpringBoot2.0系列02】SpringBoot之使用Thymeleaf视图模板 【SpringBoot2.0系列03】SpringBoot之使用freemark视图模板 【SpringBoot2.0系列04】Spr...

余空啊
2018/08/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SDKMAN推荐一个好

是在大多数基于Unix的系统上管理多个软件开发工具包的并行版本的工具。它提供了一个方便的命令行界面(CLI)和API来安装,切换,删除和列出sdk相关信息。以下是一些特性: By Developers, fo...

hotsmile
16分钟前
3
0
什么是 HDFS

是什么? HDFS 是基于 Java 的分布式文件系统,允许您在 Hadoop 集群中的多个节点上存储大量数据。 起源: 单机容量往往无法存储大量数据,需要跨机器存储。统一管理分布在集群上的文件系统称...

Garphy
19分钟前
2
0
一起来学Java8(四)——复合Lambda

在一起来学Java8(二)——Lambda表达式中我们学习了Lambda表达式的基本用法,现在来了解下复合Lambda。 Lambda表达式的的书写离不开函数式接口,复合Lambda的意思是在使用Lambda表达式实现函...

猿敲月下码
44分钟前
9
0
debian10使用putty配置交换机console口

前言:Linux的推广普及,需要配合解决实际应用方能有成效! 最近强迫自己用linux进行实际工作,过程很痛苦,还好通过网络一一解决,感谢各位无私网友博客的帮助! 系统:debian10 桌面:xfc...

W_Lu
今天
10
0
aelf Enterprise 0.8.0 beta有奖公测,“Bug奖金计划”重磅开启

2019年9月30日,aelf Enterprise 0.8.0 beta版正式发布。aelf Enterprise 0.8.0 beta是一个完备的区块链系统, 包含完备的区块链系统、开发套件、开发文档、以及配套的基础应用和基础服务。 ...

AELF开发者社区
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部