Redis学习笔记
理论基础知识
NoSQL数据库
NoSQL(Not Only SQL,不仅仅可以使用关系型数据库)数据库,又名非关系型数据库。它们的宣传口号:不是什么样的场景都必须使用关系型数据库,一些特定的场景使用NoSQL数据库更好。
常见NoSQL数据库:
- memcached :键值对,内存型数据库,所有数据都在内存中。
- Redis:和Memcached类似,还具备持久化能力。
- HBase:以列作为存储。
- MongoDB:以Document做存储。
Redis简介
Redis是用c语言编写的以Key-Value形式进行存储的NoSQL数据库管理系统·。
平时操作的数据都在内存中,效率特高,读的效率110000次/s,写81000次/s,所以多把Redis当做缓存工具使用(在一些框架中还把Redis当做临时数据存储工具)。缓存工具:把数据库中数据缓存到Redis中,由于Redis读写性能较好,访问Redis中数据,而不是频繁访问数据库中数据。
Redis以slot(槽)作为数据存储单元,每个槽中可以存储N多个键值对。Redis中固定具有16384个槽。理论上可以实现一个槽是一个Redis。每个向Redis存储数据的key都会进行crc16算法得出一个值后对16384取余就是这个key存放的solt位置。
虽然槽的大小是不固定的,但是Redis一个键值对最大大小为512M(String 类型Value)同时通过Redis Sentinel(哨兵)提供高可用,通过Redis Cluster(集群)提供自动分区。
分条整理
具备持久化功能的内存型NoSQL数据库
持久化:永久存储到硬盘
内存型:启动了Redis,所有操作都再内存上进行操作
优点:读写速率高
NoSQL
- 不用写SQL的数据库
- Not Only SQL,不仅仅只有关系型数据库
最开始的目的:代替关系型数据库
最终效果:关系型数据库和NoSQL数据库并存,相互补充
Redis存储数据的格式:Key:Value
可以将Redis理解为一个Map,只是这个Map数据具有持久化能力
数据存储原理:
- 存数据:
- 对key进行Hash算法(Crc16算法),得到一个数字
- 对数字与16384取余,得到数字(称为:槽slot,一个槽只是一个逻辑单位,里面可以存储任意多个键值对)
- 存储到对应的槽中
- 取数据:
- 对key进行Hash算法(Crc16算法),得到一个数字
- 对数字与16384取余,得到数字
- 去对应的槽中取键值对
- 存数据:
Redis是绝大多数NoSQL数据库支持集群
集群:多款相同的软件,共同维护一组数据
集群可以解决关系型数据库,单机瓶颈
情况一:安装多个Redis,每个Redis中存储一部分数据
16384:是Redis最大支持的槽数量,最小存储单元
Redis集群,平分这些槽。
若不能被整除,那么其中一个或两个Redis多一个槽
理论上限:Redis集群中,最多支持16384个Redis
redis中一个key-value最大大小为512MB
redis是线程安全的
在redis5之前是一个单线程软件
在redis6后,支持多客户端操作,但是最终执行命令时,还是单线程执行。
基于Docker安装单机版redis
安装redis的方式也是有多种,这里只演示docker安装redis
拉取镜像
docker pull redis:6.2.6
创建并启动容器
docker run -d --name redis -p 6379:6379 --restart always redis:6.2.6 --requirepass "password"
redis的默认端口号:6379
开机自启、错误重启、自启
--restart always
表示启动Docker时自动启动此容器。
查看容器
docker ps docker ps -a # 或者 docker container ls docker container ls -a
查看容器是否正常启动
docker logs -f containerName
客户端测试
连接到容器:
docker exec -it redis bash
进入容器后。在任意目录在输入
redis-cli
即可进入redis命令行也可以直接进入redis客户端工具:
docker exec -it redis redis-cli
redis可视化软件推荐
基本命令
最基本的命令
客户端连接服务器的命令
redis-cli
退出客户端命令行
exit
知识补充:
关于
docker exec -it redis bash
中的bash,这是PATH中可以直接访问到的我们可以使用下面命令来查看PATH的取值路径
echo $PATH
我这里的结果为:
/software/java/jdk/jdk-17.0.7/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
因为我配置过其它的环境变量,所以可能比大家的多出了几个路径
然后让我们查看路径下可用的命令
ls /usr/bin
然后,我们就看到了bash这个命令
所以我们也可以用下面这个命令来直接进入redis容器的redis-cli
docker exec -it redis redis-cli
redis-cli命令参数
查看帮助
redis-cli --help
Linux中的大部分命令想要查看帮助都可以使用–help参数来查看
比较全面的连接方式(然而并没有什么软用,还不如直接使用redis-cli)
redis-cli -h localhost -p 6379
常用参数列表:
- -h redis服务器主机地址 默认127.0.0.1
- -p redis服务器端口号 默认6379
测试redis服务器是否有效
下述所有命令,基于连接redis服务器后
ping命令
ping [message]
此为ping命令,没有任何参数,服务器返回PONG
(吐槽一句,发明这个命令的人是中国人吗?总让我联想到乒乓球)
ping命令可以提供任意字符串参数,输入参数是什么,服务器返回同样的字符串
如果字符串中包含空格,需要使用双引号标记开始和结束
示例如下:
127.0.0.1:6379> ping PONG 127.0.0.1:6379> ping aaa "aaa" 127.0.0.1:6379> ping "hello world" "hello world"
echo回声命令,任意字符串参数,输入什么,服务器返回什么
详细用法见上根ping的一样
echo [message]
不过林风测试后发现echo后面必须有参数,不然报错:
127.0.0.1:6379> echo (error) ERR wrong number of arguments for 'echo' command 127.0.0.1:6379> echo aaa "aaa" 127.0.0.1:6379> echo "hello world" "hello world"
数据类型
redis是一个nosql数据库,是一个key-value数据库。只能保存键值对。
其中key只可以是字符串数据。redis底层存储数据到硬盘时,存储的是字节数组。
key字符串中可以包含空格,如果包含空格,key必须使用双引号来标记开始和结束。
value 的数据类型比较多。一般问redis可以保存什么类型的数据,都是问value的类型。
value的常用类型包括;
- 字符串
- hash
- list(列表)
- set(集合)
- zset(有序集合)
- stream(流)
所有的数据类型,键值对累计最大容量512M。
redis中的所有数据的读写访问命令,是针对不同类型的value或key提供的。
客户端管理命令
key管理命令
不考虑value类型的命令。
查看key
基本用法
keys [表达式]
作用
keys命令,返回和表达式匹配的所有key列表。没有键值对,显示为空即可
参数
表达式:
表达式可包含*,代表0~n个字符
例如:
keys *
删除键值对
字符串管理命令
value是字符串类型
set保存键值对
redis中没有新增和更新区别。保存时:
- key不存在,新增
- key存在,覆盖value
基本用法
set key value
作用
新增或更新数据
注意
key和value中包含空格,使用双引号标记开始和结束
根据key查看value
基本用法
get key
作用
可以根据key来查看value的值
注意
若key不存在,则返回nil
c中的nil类似于Java中的null
未完待续。。。。