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 字符串 String
- 2.3 列表 List
- 2.4 哈希 Hash
- 2.5 集合 Set
- 2.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)等类型。
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-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 存在则删除 key |
keys * | 查看所有的key |
select 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-vOK127.0.0.1:6379[1]> get name #根据key获取value"zhangsan"127.0.0.1:6379[1]> keys * #查看当前库有多少key1) "name"127.0.0.1:6379[1]> exists name #查看是否存在当前key(integer) 1127.0.0.1:6379[1]> append name Love_lisi #如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾(integer) 17127.0.0.1:6379[1]> strlen name #返回回 key 所储存的字符串值的长度(integer) 17127.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 20OK127.0.0.1:6379[1]> incr age # 将key所对应的v+1(integer) 21127.0.0.1:6379[1]> incr age (integer) 22127.0.0.1:6379[1]> get age"22"127.0.0.1:6379[1]> decr age # 将key所对应的v-1(integer) 21127.0.0.1:6379[1]> decr age (integer) 20127.0.0.1:6379[1]> get age"20"127.0.0.1:6379[1]> incrby age 5 # 将key所对应的v+指定数值(integer) 25127.0.0.1:6379[1]> get age"25"127.0.0.1:6379[1]> decrby age 10 # 将key所对应的v-指定数值(integer) 15127.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) 4127.0.0.1:6379[1]> rpush list b(integer) 5127.0.0.1:6379[1]> rpush list c(integer) 6127.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) 4127.0.0.1:6379[1]> lrem list 1 a #根据参数 count 的值,移除列表中与参数 value 相等的元素(integer) 1127.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多亿个成员)。