Redis 教程

it2023-02-12  50

Redis 教程入门详解

一、Redis简介1.1 redis的特点1.2 Redis 优势1.3 Redis与其他key-value存储有什么不同?1.4 Redis 数据类型1.4.1 String (字符串类型)1.4.2 Hash(哈希,类似 Java里的Map)1.4.3 List(列表)1.4.4 Set(集合)1.4.5 Zset(sorted set:有序集合) 1.5、redis的启动运行 二、Redis数据类型2.1 redis键(key)2.2 字符串 String2.3 列表 List2.4 哈希 Hash2.5 集合 Set2.6 有序集合(sorted set)

一、Redis简介

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。 Redis是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

Redis 最好的学习网站 ,链接直达 Redis中文网

1.1 redis的特点

Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库 Redis 与其他 key - value 缓存产品有以下三个特点:

Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。Redis支持数据的备份,即master-slave模式的数据备份。

1.2 Redis 优势

性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

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

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

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

1.4 Redis 数据类型

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

1.4.1 String (字符串类型)

String是redis最基本的类型,你可以理解成Memcached一模一样的类型,一个key对应一个value。String类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。String类型是redis最基本的数据类型,一个redis中字符串value最多可以是512M

1.4.2 Hash(哈希,类似 Java里的Map)

Redis hash 是一个键值对集合。 Redis hash是一个String类型的field和value的映射表,hash特别适合用于存储对象。类似Java里面的Map<String,Object>

1.4.3 List(列表)

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

1.4.4 Set(集合)

Redis的Set是String类型的无序集合,它是通过HashTable实现的 !

1.4.5 Zset(sorted set:有序集合)

Redis zset 和 set 一样,也是String类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。Redis正是通过分数来为集合中的成员进行从小到大的排序,zset的成员是唯一的,但是分数(Score) 却可以重复。

1.5、redis的启动运行

Redis 的安装教程就不在这里介绍,如有需要可访问windows版本、Linux版本

因为本人采用的是Win版本,所以这里只介绍Windows系统的启动方式。 Redis 可分为redis-server服务 和 redis-cli客户端,在运行客户端之前先需要启动服务。

Redis-server服务启动方式 方式一:

双击redis-server即可启动然后双击redis-cli启动运行Redis (左图启动redis服务,右图客户端输入redis-cli 连接,输入ping 如果返回PONG则说明redis连接成功) 通过方式一即可启动服务,不过在关掉该窗口后redis服务就会关闭,我们也可以选择一直开启服务。

方法二 redis作为windows服务启动方式

启动服务:redis-server --service-start停止服务:redis-server --service-stop

在输入命令后,我们可以在任务管理器中看到redis的进程,然后dos窗口下输入redis-cli 就可以连接成功。(如果需要在任意目录启动服务,可以自行配置redis的环境变量)

二、Redis数据类型

2.1 redis键(key)

Redis 键命令用于管理 redis 的键。

命令描述DEL key如果key 存在则删除 keykeys *查看所有的keyselect db选择转换数据库flushdb删除当前数据库里的文件flushall删除所有数据库文件exists key判断某个key是否存在move key db将该关键字从库中移除expire key second为当前key设置生存时间ttl key查看当前key还有多少秒过期TYPE key返回 key 所储存的值的类型rename key newkey修改 key 的名称

如果需要了解更多命令请参考:Redis教程

2.2 字符串 String

127.0.0.1:6379[1]> set name zhangsan # 设置k-v OK 127.0.0.1:6379[1]> get name #根据key获取value "zhangsan" 127.0.0.1:6379[1]> keys * #查看当前库有多少key 1) "name" 127.0.0.1:6379[1]> exists name #查看是否存在当前key (integer) 1 127.0.0.1:6379[1]> append name Love_lisi #如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾 (integer) 17 127.0.0.1:6379[1]> strlen name #返回回 key 所储存的字符串值的长度 (integer) 17 127.0.0.1:6379[1]> get name "zhangsanLove_lisi" 127.0.0.1:6379[1]> getrange name 0 5 #获取部分字符串 "zhangs" 127.0.0.1:6379[1]> getrange name 0 -1 #获取所有字符串 "zhangsanLove_lisi" 127.0.0.1:6379[1]> 127.0.0.1:6379[1]> set age 20 OK 127.0.0.1:6379[1]> incr age # 将key所对应的v+1 (integer) 21 127.0.0.1:6379[1]> incr age (integer) 22 127.0.0.1:6379[1]> get age "22" 127.0.0.1:6379[1]> decr age # 将key所对应的v-1 (integer) 21 127.0.0.1:6379[1]> decr age (integer) 20 127.0.0.1:6379[1]> get age "20" 127.0.0.1:6379[1]> incrby age 5 # 将key所对应的v+指定数值 (integer) 25 127.0.0.1:6379[1]> get age "25" 127.0.0.1:6379[1]> decrby age 10 # 将key所对应的v-指定数值 (integer) 15 127.0.0.1:6379[1]> get age "15" 127.0.0.1:6379[1]> .....

2.3 列表 List

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

一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

127.0.0.1:6379[1]> lpush list 1 #将一个值插入到列表(左)头部。 (integer) 1 127.0.0.1:6379[1]> lpush list 2 (integer) 2 127.0.0.1:6379[1]> lpush list 3 (integer) 3 127.0.0.1:6379[1]> lrange list 0 -1 #lrange:返回列表中指定区间内的元素, 区间以偏移量 START 和 END 指定。 # 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素。 # 也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素 1) "3" 2) "2" 3) "1" 127.0.0.1:6379[1]> rpush list a #将一个=值插入到列表尾(右)部。 (integer) 4 127.0.0.1:6379[1]> rpush list b (integer) 5 127.0.0.1:6379[1]> rpush list c (integer) 6 127.0.0.1:6379[1]> lrange list 0 -1 #查看列表全部元素 1) "3" 2) "2" 3) "1" 4) "a" 5) "b" 6) "c" 127.0.0.1:6379[1]> 127.0.0.1:6379[1]> lpop list #移除并返回列表的第一个元素。当列表 key 不存在时,返回 nil "3" 127.0.0.1:6379[1]> rpop list #移除列表的最后一个元素,返回值为移除的元素。 "c" 127.0.0.1:6379[1]> lrange list 0 -1 #查看列表全部元素,会发现第一个元素3和最后一个元素c都删除了 1) "2" 2) "1" 3) "a" 4) "b" 127.0.0.1:6379[1]> lindex list 0 #Lindex,按照索引下标获得元素(-1代表最后一个,0代表是第一个) "2" 127.0.0.1:6379[1]> lindex list 1 "1" 127.0.0.1:6379[1]> lindex list 5 (nil) #没有该元素则返回null 127.0.0.1:6379[1]> lindex list -1 "b" 127.0.0.1:6379[1]> lrange list 0 -1 #查看列表所有元素 1) "2" 2) "1" 3) "a" 4) "b" 127.0.0.1:6379[1]> llen list # 返回列表的长度 (integer) 4 127.0.0.1:6379[1]> lrem list 1 a #根据参数 count 的值,移除列表中与参数 value 相等的元素 (integer) 1 127.0.0.1:6379[1]> lrange list 0 -1 #查看列表所有元素,可以看到元素a被移出了 1) "2" 2) "1" 3) "b" #lset key index value 将列表 key 下标为 index 的元素的值设置为 value 127.0.0.1:6379[1]> lset list 0 22 #将第一个元素值2改为22 OK 127.0.0.1:6379[1]> lrange list 0 -1 1) "22" 2) "1" 3) "b" 127.0.0.1:6379[1]> .....

2.4 哈希 Hash

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

Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

2.5 集合 Set

Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

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

集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

2.6 有序集合(sorted set)

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

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

有序集合的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295,每个集合可存储40多亿个成员)。

最新回复(0)