读书笔记 之《Redis实战》第一章 初识

第一部分 入门

第一章 初识

Redis 是一个使用 C 语言开发的高速缓存数据库。

是一个远程的内存数据库。

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

Redis属于NoSQL数据库或者菲关系数据库,Redis不使用表。

Redis与memcached的比较

Redis:

  • 能够自动以不同的方式将数据写入硬盘
  • Redis能够存储普通字符串和其他4中数据结构
  • 既能做主数据库,又可以作为其他存储系统的辅助数据库

memcached:

  • 只能存储普通的字符串

一些数据库和缓存服务器的特性和功能

image-20201220121923019

1.1.2 附加特性

1、持久化

问题:当服务器被关闭时,服务器存储的数据将何去何从?

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

  • 第一种持久化方法:时间点转储(point-in-timedump)
    • 转储操作执行的时间:
      • 指定时间段内有指定数量的写操作执行
      • 调用两条转储到硬盘
  • 第二种持久化方法:将所有修改了数据库的命令都写入到一个只追加(append-only)文件里面
    • 可以根据重要程度将只追加写入设置为从不同步每秒同步一次、或者每写入一个命令就同步一次

2、故障转移、主从复制

为了扩展Redis的读性能,为Redis提供了故障转移(failover)支持,Redis 实现了主从复制特性:

  • 执行了复制的从服务器会连接上主服务器,接受主服务器发送的整个数据库的初始副本(copy);
  • 之后主服务器执行的命令,都会被发送给所有连接的从服务器去执行,从而实时的更新从服务器的数据集。
  • 因为从服务器包含的数据会不断的更新,所以客户端可以向任意一个从服务器发送读请求,以此来避免对主服务器进行集中式的访问
1.2 Redis数据结构简介

Redis可以存储键与5种不同数据结构类型之间的映射

5中数据类型:

  • String(字符串)
  • List(列表)
  • Set(集合)
  • Hash(散列)
  • ZSet(有序集合)

image-20201220124800076

接下来来测试命令:

使用Redis和Java语言

打开Redis-server:

image-20201220125712667

打开Redis客户端:

image-20201220125757362

1.2.1 字符串

image-20201220130033270

image-20201220125546006

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello
(nil)
127.0.0.1:6379>
1.2.2 Redis中的列表

image-20201220130148392

列表命令:

命令行为
LPUSH将元素推入列表的左端
RPUSH将元素推入列表的右端
LPOP从列表的左端弹出元素
RPOP从列表的右端弹出元素
LRANGE获取列表给定范围上的所有值
Lindex获取列表在给定位置上的单个元素
127.0.0.1:6379> rpush list-key item  #在列表的左边push一个值
(integer) 1
127.0.0.1:6379> rpush list-key item2
(integer) 2
127.0.0.1:6379> rpush list-key item
(integer) 3
127.0.0.1:6379> lrange list-key 0 -1  #获取列表的所有值
1) "item"
2) "item2"
3) "item"
127.0.0.1:6379> lindex list-key 1 #获取索引为1的列表中的值
"item2"
127.0.0.1:6379>
127.0.0.1:6379> lpop list-key      #从列表的左边弹出一个值
"item"
127.0.0.1:6379> lrange list-key 0 -1
1) "item2"
2) "item"
127.0.0.1:6379>
1.2.3 Redis的集合

Redis的集合和列表都可以存储多个字符串,但是他们的不同在于:

列表可以存储多个相同的字符串,而集合则是通过散列表来保证自己存储的每个字符串都各不相同(这些散列表只有键,但是没有与键相关联的值)

image-20201220131426809

Redis的集合是使用无序方式存储元素,所以不能像列表那样,将元素推入集合的某一端或者从某一端弹出元素。

集合命令:

  • sadd 将元素添加到集合 返回1:添加成功;返回0:元素已经存在集合中
  • srem 从结婚中移除元素
  • sismember 快速检查一个袁旭是否已经存在
  • smembers 获取集合中的所有元素
127.0.0.1:6379> sadd set-key item   #往集合中添加元素,添加成功返回1
(integer) 1
127.0.0.1:6379> sadd set-key item2
(integer) 1
127.0.0.1:6379> sadd set-key item3
(integer) 1
127.0.0.1:6379> sadd set-key item    #往集合中添加元素,添加失败返回0
(integer) 0
127.0.0.1:6379> smembers set-key     #返回集合中国所有的元素
1) "item2"
2) "item"
3) "item3"
127.0.0.1:6379> sismember set-key item4  #检查集合是否存在item4元素,若不存在返回0
(integer) 0
127.0.0.1:6379> sismember set-key item
(integer) 1
127.0.0.1:6379> srem set-key item2      #移除元素
(integer) 1
127.0.0.1:6379> srem set-key item2
(integer) 0
127.0.0.1:6379> smembers set-key
1) "item"
2) "item3"
1.2.4 Redis的散列

Redis的散列可以存储多个键值对支架的映射。散列存储的值既可以是字符串又可以是数字值。

并且可以对数字值执行自增或自减操作。

image-20201220141930793

命令:

image-20201220142041599

127.0.0.1:6379> hset hash-key sub-key1 value1  #添加键值对到散列
(integer) 1
127.0.0.1:6379> hset hash-key sub-key2 value2 
(integer) 1
127.0.0.1:6379> hset hash-key sub-key1 value
(integer) 0
127.0.0.1:6379> hgetall hash-key              #获取所有的键值对
1) "sub-key1"
2) "value"
3) "sub-key2"
4) "value2"
127.0.0.1:6379> hget hash-key sub-key1       #获取指定散列键的值
"value"
127.0.0.1:6379> hdel hash-key sub-key2        #删除键
(integer) 1
127.0.0.1:6379> hgetall hash-key
1) "sub-key1"
2) "value"
127.0.0.1:6379>
1.2.5 有序集合

有序集合和散列一样,都用于存储键值对:

有序集合的被称为成员(member),每个成员都各不相同

有序集合的被称为分值(score,分值必须为浮点数

有序集合是Redis里面唯一一个既可以根据成员访问元素(跟散列一样),又可以根据分值以及分值的排列顺序来访问元素的结构。

image-20201220143025042

命令:

image-20201220143051554

127.0.0.1:6379> zadd zset-key 567 member1 #将一个带有给定分值的成员添加到有序集合里面,返回添加元素的个数
(integer) 1
127.0.0.1:6379> zadd zset-key 1020 member2
(integer) 1
127.0.0.1:6379> zrange zset-key 0 -1 withscores #获取优速集合包含的所有元素时,多个元素会按照分值大小进行排序
1) "member1"
2) "567"
3) "member0"
4) "982"
5) "member2"
6) "1020"
127.0.0.1:6379> zrangebyscore zset-key 0 800 withscores #获取有序集合在给定分值范围内的所有元素
1) "member1"
2) "567"
127.0.0.1:6379> zrem zset-key member1  #移除
(integer) 1
127.0.0.1:6379> zrem zset-key member1
(integer) 0

现在已经基本了解了Redis提供的5中结构,接下来看看如何通过结合散列的数据存储能力和有序集合内建的排序能力来解决常见的问题。

1.3 Redis解决实际问题

1、对文章进行投票

2、发布并获取文章

3、对文章进行分组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值