第一章——redis教程

简介:Redis是一个由xxx写的 key-value 存储系统,是跨平台的非关系型数据库;

 Redis 是开源的,键值对(Key-Value)存储数据库,提供多种语言的 API;

Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。 

Redis基本的五种数据类型:

String: 字符串

Hash: 散列

List: 列表

Set: 无序集合

Sorted Set: 有序集合

1.1——Redis简介

Redis 是完全开源的,高性能的 key-value 数据库。

Redis 与其他 key - value 缓存产品有以下三个特点:

第一:Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

第二:Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

第三:Redis支持数据的备份,即master-slave模式的数据备份。

Redis的优势:

1.性能极高

2.丰富的数据类型

3.原子 – Redis的所有操作都是原子性的,

意思就是要么成功执行,要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过mutil和exec指令包起来。

4.丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

Redis与其他key-value存储有什么不同?

Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。

Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

笔记:

1.什么是 BSD 协议?

BSD开源协议是一个给于使用者很大自由的协议。

2.什么是原子性,什么是原子性操作?

举个例子:

A想要从自己的帐户中转1000块钱到B的帐户里。那个从A开始转帐,到转帐结束的这一个过程,称之为一个事务。在这个事务里,要做如下操作:

  •  1. 从A的帐户中减去1000块钱。如果A的帐户原来有3000块钱,现在就变成2000块钱了。
  •  2. 在B的帐户里加1000块钱。如果B的帐户如果原来有2000块钱,现在则变成3000块钱了。

如果在A的帐户已经减去了1000块钱的时候,忽然发生了意外,比如停电什么的,导致转帐事务意外终止了,而此时B的帐户里还没有增加1000块钱。那么,我们称这个操作失败了,要进行回滚。回滚就是回到事务开始之前的状态,也就是回到A的帐户还没减1000块的状态,B的帐户的原来的状态。此时A的帐户仍然有3000块,B的帐户仍然有2000块。

我们把这种要么一起成功(A帐户成功减少1000,同时B帐户成功增加1000),要么一起失败(A帐户回到原来状态,B帐户也回到原来状态)的操作叫原子性操作。

如果把一个事务可看作是一个程序,它要么完整的被执行,要么完全不执行。这种特性就叫原子性。

3.什么是 key value 存储?

JAVA 中的 map 就是 key=>value 存储的。

键 => 值(key=>value)对,键唯一,对应一个值,值的形式多样。

比如:

Map<String, int> map = new HashMap<String, int>();
map.put("ming",1);
map.put("zi",2);

这里定义了一个 Map 对象,并放置了两组数据键 ming,对应值 1,键 zi,对应值2

map.get("ming");

这样会得到 1 这个值。

如果你再设置 map.put("ming",3); 因为键 ming 已经存在,键值唯一,所以原先的值 1 会被覆盖。

1.2——Redis安装 

  1. Mac 下安装

     1. 官网Redis 下载最新的稳定版本redis-6.2.6

  2. 解压拖动到桌面

    打开终端

    make test 测试编译
  3. make install 

  4. 启动 redis,可以使用后台服务启动 src/redis-server  

  5. 启动redis客户端——redis-cli

1.3——Redis配置 

Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf

你可以通过 config 命令查看或设置配置项。

语法

redis config命令格式如下:

127.0.0.1:6379> config get config_setting_name

实例:

127.0.0.1:6379> config get loglevel
1) "loglevel"
2) "notice"

使用 * 号获取所有配置项:

127.0.0.1:6379> config get *

编辑配置

你可以通过修改 redis.conf 文件或使用 config set 命令来修改配置。

语法

 config set 命令基本语法:

127.0.0.1:6379> config set config_setting_name new_config_value

实例

127.0.0.1:6379> config set loglevel "notice"
OK
127.0.0.1:6379> CONFIG GET loglevel

1) "loglevel"
2) "notice"

1.4——Redis数据类型 

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 

String(字符串)

string 是 redis 最基本的类型,一个 key 对应一个 value。

实例

 127.0.0.1:6379> SET runoob "菜鸟教程"
OK
 127.0.0.1:6379> GET runoob
"菜鸟教程"

在以上实例中我们使用了 Redis 的 set 和 get 命令。键为 runoob,对应的值为 菜鸟教程


Hash(哈希)

Redis hash 是一个键值(key=>value)对集合。

Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

实例

del runoob 用于删除前面测试用过的 key,不然会报错:(error) WRONGTYPE Operation against a key holding the wrong kind of value

 127.0.0.1:6379> del runoob
 127.0.0.1:6379> hmset runoob field1 "Hello" field2 "World"
"OK"
 127.0.0.1:6379> hset runoob field1
"Hello"
127.0.0.1:6379> hset runoob field2
"World"

实例中我们使用了 Redis hmset, hget 命令,hmset 设置了两个 field=>value 对, hget 获取对应 field 对应的 value.


List(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

实例

127.0.0.1:6379> del runoob
 127.0.0.1:6379> lpush runoob redis
(integer) 1
 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
 127.0.0.1:6379> lpush runoob rabbitmq
(integer) 3
127.0.0.1:6379> lrange runoob 0 10
1) "rabbitmq"
2) "mongodb"
3) "redis"
 127.0.0.1:6379>

Set(集合)

Redis 的 Set 是 string 类型的无序集合

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 0(1)。

sadd 命令

添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0。

sadd key member

实例

127.0.0.1:6379> del runoob
127.0.0.1:6379> sadd runoob redis
(integer) 1
127.0.0.1:6379> sadd runoob mongodb
(integer) 1
127.0.0.1:6379> sadd runoob rabbitmq
(integer) 1
127.0.0.1:6379> sadd runoob rabbitmq
(integer) 0
127.0.0.1:6379> smembers runoob

1) "redis"
2) "rabbitmq"
3) "mongodb"

注意:以上实例中 rabbitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。


zset(sorted set:有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。

zadd 命令

添加元素到集合,元素在集合中存在则更新对应score

zadd key score member 

实例

127.0.0.1:6379> del runoob
 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
 127.0.0.1:6379> zadd runoob 0 rabbitmq
(integer) 1
 127.0.0.1:6379> zadd runoob 0 rabbitmq
(integer) 0
127.0.0.1:6379> zrangebyscore runoob 0 1000
1) "mongodb"
2) "rabbitmq"
3) "redis"

redis遇到的问题总结:

更多推荐

redis基础知识——菜鸟教程