Redis
本章知识点
三 Redis入门
3.1 数据库理论
按照早期的数据库理论,比较流行的数据库模型有三种,分别为层次式数据库、网络式数据库和关系型数据库(前两者已经基本消失)。
而当今的互联网中,最常用的数据库模型主要是两种即 关系型数据库 和 非关系型数据库。
关系型数据库:关系型数据库以行和列的形式存储数据,以便于用户理解。这一系列的行和列被称为表,一组表组成了数据库。(列是固定 行动态添加)。常见的关系型数据库MySQL、 Oracle 、SQLserver
非关系型数据库:非关系型数据库也被称为NoSQL数据库,NoSQL的本意是“Not Only SQL”,指的是非关系型数据库,而不是“No SQL”的意思(没有SQL语句?),因此,NoSQL的产生并不是要彻底否定关系型数据库,而是作为传统关系型数据库的一个有效补充。NoSQL数据库在特定的场景下可以发挥出难以想象的高效率和高性能。
3.2 Redis数据库服务
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持[字符串]、[哈希表]、[列表]、[集合]、[有序集合],[位图],[hyperloglogs]等数据类型。内置复制、[Lua脚本]、LRU收回、[事务]以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动[分区]。
① redis是开源的 底层是c语言。
② redis的存储是基于内存的。
电脑: 内存 16G Redis数据是存储到内存中 可以进行持久化
硬盘 500G MySQL数据存储是存储到硬盘
Redis为什么比MySQL快 Redis直接从内存中查数据
MySQL需要先从硬盘中将数据加载到内存再查询数据
③ 作为数据库。
我们使用Redis 用来存储的是 临时数据 缓存数据
④ 作为消息队列
Redis可以做消息队列 但是不擅长
⑤ 支持5种数据类型
关系型数据库:行和列的形式进行存储
非关系型数据库中的Redis是以key-value的形式进行存储 类似于我们Java中 HashMap
strings, hashes, lists, sets, sorted sets
String: Map<String,String>
List: Map<String,List>
Hash: Map<String,Map>
Set: Map<String,Set>
⑥ 内置 复制、[Lua脚本]、LRU(最少做小算法 FIFO)收回、[事务])以及不同级别磁盘持久化功能
(redis不仅可以存储数据到内存 也可以持久化到硬盘rdb和aof)
⑦Redis Sentinel提供高可用---哨兵机制
⑧ Redis Cluster 集群 redis集群版
⑨ redis以前是单线程的 6.0以后变成了多线程 Redis最新版本7.0
3.3 Redis优势
Redis 与其他 key - value 缓存产品有以下三个特点:
①Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
②Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis存储形式时key-value的形式 但是value可以是 基本类型 也可以是list set hash zset
③Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势
①性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
②丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
③原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
④丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis与其他key-value存储有什么不同?
① Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
② Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
3.4 Redis安装
克隆一台linux主机 修改ip地址 hostname 重启
安装gcc-c++ : yum -y install gcc-c++
在home下创建一个redis的文件夹: mkdir /home/redis
移动到这个文件夹下: cd /home/redis
下载redis : wget https://download.redis.io/releases/redis-5.0.9.tar.gz
解压redis: tar -zxvf redis-5.0.9.tar.gz
进入到redis解压目录: cd redis-5.0.9
编译并运行:make && make install PREFIX=/usr/local/redis
移动到redis的安装目录: cd /usr/local/redis
启动redis : ./bin/redis-server
当我们直接这样启动的时候 此时我们当前xshell窗口已经被redis占用,我们使用ctrl+z 此时会停止redis。
修改守护线程(相当于让redis服务启动的时候 能在后台运行)
将配置文件拷贝到bin目录下:cp /home/redis/redis-5.0.9/redis.conf /usr/local/redis/bin
修改bin下的配置文件: vim /usr/local/redis/bin/redis.conf
将136行改为 yes 开启守护进程 底行模式 :136 确定
再次启动redis的时候 需要我们用配置文件启动
运行redis: ./bin/redis-server ./bin/redis.conf
客户端连接: ./bin/redis-cli
在连接上redis之后 如果想关闭redis 服务:
shutdown
shutdown save
ctrl+c 退出连接
ps -ef | grep redis 找到进程号 kill -9 进程号
3.5 Redis的类型和常用命令
3.2.1 redis的操作GEO
添加地理位置
GEOADD china 116.23128 40.22077 bj 121.48941 31.40527 sh 113.27324 23.15792 gz 113.88308 22.55329 sz
获取深圳的坐标
GEOPOS china sz
计算深圳到上海之间的距离
GEODIST china sz sh km
获取 116.23128 40.22077 位置 800km以内的地区
GEORADIUS china 116 40 800 km
获取深圳800km范围内的城市
GEORADIUSBYMEMBER china sz 800 km
获取深圳的hash值
GEOHASH china sz
3.2.2 Redis中的 Strings 相当于java中的 Map<String,String>
添加key-value set key value
SET a 123456
获取redis中的所有key
keys *
获取对应key的数据 get key
GET a
删除对应key的数据 del key
DEL a
面试题: 请问redis中怎么存储Java对象?( java中要往redis存储数据 你好 世界 set a 你好世界 People对象 )
A hash
B json (将java对象转换成json字符串,将来从redis中取出来的时候还是json字符串,再将json字符串转换成java对象)
C 序列化 (将java对象进行序列化编码,将编码存储到redis中,将来取出来还是编码,在进行反序列化还原成java对象)
D 逻辑key 1 张三 18 北京
set test abcdefg
获取test子字符 Getrange test 1 3
给test重新赋值qwerdf并获取以前的值 getset test qwerdf
获取多个key的值 mget test test1
创建test2 并且5秒后过期 setex test2 5 hahaha
设置test3 如果没有就设定 setnx test3 hehehe
将test第三位后面改成lalala setrange test 3 lala
获取test的长度 strlen test
同时设定多个key-value mset t1 a t2 b t3 c
Expire test 10
Set index 0
给index原子性自增1 INCR index
给index原子性自减1 DECR index
给index原子性自增2 INCrBY index 2
给index原子性自增2.5 INCEBYFLOAT index 2.5
给index追加haha APPEND index 33
3.2.3 redis中的hash Map<String,Map>
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 – 1 键值对(40多亿)。
添加一个set数据 hset stu id 1
Hset stu name 张三
Hset stu age 18
添加多个数据 hmset stu address 北京 grade 一年级
获取全部内容 hgetall stu
根据关键字获取值 hget stu age
获取多个 hmget stu id name age
获取所有的关键字 hkeys stu
获取所有的值 hvals stu
获取长度 hlen stu
删除某个或多个关键字 hdel stu id name age
删除stu这个hash del stu
3.2.4 redis中的list Map<String,List>
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 232 – 1 个元素 (4294967295, 每个列表超过40亿个元素)。
左添加数据到list中 lpush no 1 2 3 4 5
右添加数据到list中 rpush no 6 7 8 9 10
获取长度 llen no
获取指定索引的数据 lindex no 3
获取指定范围内的数据 lrange no 0 -1
在1的前面添加aa linsert no before 1 aa
指定索引位置添加数据 lset no 1 haha
左删除第一个数据 lpop no
右删除第一个数据 rpop no
裁剪指定区域数据 ltrim no 3 6
应用场景 : 微博关注 粉丝列表 消息队列等 MQ
3.2.5 Redis 的 Set Map<String,Set>
是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232 – 1 (4294967295, 每个集合可存储40多亿个成员)。
添加数据到set中 sadd haha aa bb cc dd aa
获取长度 scard haha
获取所有的元素 smembers haha
删除set中的元素 spop haha 2
Sadd hehe aa bb cc dd ee
查看第一个集合和其他集合的差异 sdiff hehe haha
查看两个集合的交际 sinter haha hehe
查看两个集合的交际并存储 sinterstore heihei haha hehe
应用场景 : 共同粉丝
3.2.6 Redis 有序集合(sorted set)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 有序集合的成员是唯一的,但分数(score)却可以重复。 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 – 1 (4294967295, 每个集合可存储40多亿个成员)。
添加数据 zadd jifen 1.2 zhangsan 2.5 lisi 3.6 wangwu 4.8 zhaoyun 5.9 maliu
查看属性 zcard jifen
更新数据 zadd jifen 4.4 zhangsan
查看积分榜 zrangebyscore jifen 1 9
查看1-5分的数据数量 zcount jifen 1 5
查询索引0-3之间的数据 zrange jifen 0 3
应用场景: 排行榜 积分系统
3.6 Java链接Redis
1 导入jar包
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
2 Redis 配置文件 需要配置
bind 192.168.150.130
3 启动Redis ./redis-server redis.conf
4 java程序 链接Redis完成数据的存储
public class JavaTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.150.130", 6379);
jedis.set("hahaha","666666");
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/117997.html