Redis 基础一
在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来,随着访问量的提升,使用关系型数据库的Web站点多多少少都开始在性能上出现了一些瓶颈,而瓶颈的源头一般是在磁盘的I/O上。而随着互联网技术的进一步发展,各种类型的应用层出不穷,这导致在当今云计算、大数据盛行的时代,对性能有了更多的需求,主要体现在以下四个方面:
- 低延迟的读写速度:应用快速地反应能极大地提升用户的满意度
- 支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用PB级别的数据和能应对百万级的流量
- 大规模集群的管理:系统管理员希望分布式应用能更简单的部署和管理
- 庞大运营成本的考量:IT部门希望在硬件成本、软件成本和人力成本能够有大幅度地降低
为了克服这一问题,NoSQL应运而生,它同时具备了高性能、可扩展性强、高可用等优点,受到广泛开发人员和仓库管理人员的青睐
1.Redis(NoSQL)
1.1 什么是redis
Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
- 基于内存运行,性能高效
- 支持分布式,理论上可以无限扩展
- key-value存储系统
- 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
相比于其他数据库类型,Redis具备的特点是:
- C/S通讯模型
- 单进程单线程模型
- 丰富的数据类型
- 操作具有原子性
- 持久化
- 高并发读写
- 支持lua脚本
1.2 redis数据结构
字符串(Strings)
字符串是redis的基本结构数据之一,又key和value组成。它是一个二进制安全的字符串,不仅可以存储字符串还可以存储图片,视频等多种类型的数据最大长度支持512M
## 创建一个字符串
192.168.18.128:7000> set nidie xym
OK
192.168.18.128:7000> get nidie
"xym"
## 查看所有key的命令
192.168.18.128:7000> keys *
1) "nidie"
哈希(Hash)
哈希是无序字典,内部实现数组和链表 ,redis中的Hash建只能是String
## 一次添加一个键值
192.168.18.128:7000> hset test name tom
(integer) 1
192.168.18.128:7000> hget test name
"tom"
## 一次添加多个键值
192.168.18.128:7000> hmset test1 name xixi age 18
OK
192.168.18.128:7000> hmget test1 name age
1) "xixi"
2) "18"
## 获得所有的字段和值
192.168.18.128:7000> hmget test1 name age
1) "xixi"
2) "18"
192.168.18.128:7000> hgetall test
1) "name"
2) "tom"
192.168.18.128:7000> hgetall test1
1) "name"
2) "xixi"
3) "age"
4) "18"
这里不过多演示了 后面会更新的命令使用教程
** 列表(List)**
redis的列表是一个链表 list的插入和删除非常快 但是索引定位很慢,当列表弹出最后一个元素该数据结构自动被删除,可以把列表看成一根水管 数据可以从一边进,然后从另一边出来。
## 插入数据 l代表left(左),r代表right(右)
192.168.18.128:7000> rpush test2 a b c
(integer) 3
192.168.18.128:7000> llen test2
(integer) 3
192.168.18.128:7000> lrange test2 0 -1
1) "a"
2) "b"
3) "c"
192.168.18.128:7000> lpush test3 a b c
(integer) 3
192.168.18.128:7000> llen test3
(integer) 3
192.168.18.128:7000> LRANGE test3 0 -1
1) "c"
2) "b"
3) "a"
##弹出数据 弹出数据的同时会将数据删除
192.168.18.128:7000> RPOP test2 1
1) "c"
192.168.18.128:7000> RPOP test2 2
1) "b"
2) "a"
192.168.18.128:7000> RPOP test2 3
(nil)
192.168.18.128:7000> LPOP test3
"c"
192.168.18.128:7000> LPOP test3
"b"
192.168.18.128:7000> LPOP test3
"a"
192.168.18.128:7000> LPOP test3
(nil)
集合(Set)
在redis集合中数据的无序的不能重复
## 添加数据
192.168.18.128:7000> SADD TEST4 PHP
(integer) 1
192.168.18.128:7000> SADD TEST4 PHP
(integer) 0 //添加重复的返回值为0
192.168.18.128:7000> SADD TEST4 JAVA PYTHON
(integer) 2
## 获取集合中的数量
192.168.18.128:7000> SCARD TEST4
(integer) 3
192.168.18.128:7000> SMEMBERS TEST4
1) "PHP"
2) "PYTHON"
3) "JAVA" //集合是无序的 获取的也是无序的 在生产环境中谨慎使用 数据量可能会导致服务器宕机
192.168.18.128:7000> SPOP TEST4
"PHP" //弹出数据并删除
192.168.18.128:7000> SMEMBERS TEST4
1) "PYTHON"
2) "JAVA"
## 判断数据是否存在
192.168.18.128:7000> SISMEMBER TEST4 GOLANG
(integer) 0
## 删除数据
192.168.18.128:7000> SREM TEST4 JAVA PYTHON
(integer) 2
192.168.18.128:7000> SMEMBERS TEST4
(empty array)
## 取交集
192.168.18.128:7000> SINTER key1 key2
## 取并集
192.168.18.128:7000> SUNION key1 key2
## 去差集
192.168.18.128:7000> SDIFF key1 key2
有序集合(zset)
zset是一个有序集合 保证元素的唯一性 ,并且可以给每个元素会关联一个double类型的分数 通过这个权重来进行从小到大进行排序 。
## 添加数据
192.168.18.128:7000> ZADD TEST5 1.1 A
(integer) 1
192.168.18.128:7000> ZADD TEST5 1.2 B
(integer) 1
192.168.18.128:7000> ZADD TEST5 1.3 C
(integer) 1
## 获取数据
基于位置的排序
192.168.18.128:7000> ZRANGE TEST5 0 -1
1) "A"
2) "B"
3) "C"
192.168.18.128:7000> ZREVRANGE TEST5 0 -1
1) "C"
2) "B"
3) "A"
基于权重的排序
192.168.18.128:7000> ZRANGEBYSCORE TEST5 1.1 1.3
1) "A"
2) "B"
3) "C"
192.168.18.128:7000> ZREVRANGEBYSCORE TEST5 1.3 1.1
1) "C"
2) "B"
3) "A"
## 修改数据
192.168.18.128:7000> ZADD TEST5 NX A
(integer) 0
192.168.18.128:7000> ZSCORE TEST5 A
"1.1000000000000001"
192.168.18.128:7000> ZINCRBY TEST5 +0.1 A
"1.2000000000000002"
## 获取排名
192.168.18.128:7000> ZRANK TEST5 A
(integer) 1
192.168.18.128:7000> ZRANK TEST5 B
(integer) 0
192.168.18.128:7000> ZRANK TEST5 C
(integer) 2
192.168.18.128:7000> ZSCORE TEST5 A
"1.2000000000000002"
192.168.18.128:7000> ZSCORE TEST5 B
"1.2"
192.168.18.128:7000> ZSCORE TEST5 C
"1.3"
192.168.18.128:7000> ZREVRANK TEST5 A
(integer) 1
192.168.18.128:7000> ZREVRANK TEST5 B
(integer) 2
192.168.18.128:7000> ZREVRANK TEST5 C
(integer) 0
## 查看权值范围的值有多少
192.168.18.128:7000> ZCOUNT TEST5 1 2
(integer) 3