一、问题引入
1.1什么是NoSQL
NoSQL翻译出来就是不仅仅是SQL的意思,它泛指非关系型数据库,NoSQL不依赖与逻辑业务的存储,而是以key-value的形式进行存储的,这样大大增加了数据库的扩展能力。
它的基本特点
- 不遵循SQL标准
- 不支持ADIC.四种事务。
- 性能远超于SQL
使用场景
- 对高并发的读写
- 海量数据的读写
- 对数据可高扩展性的
1.2 Redis概述
- Redis是一个开源的key-value存储系统
- 和Memcached类似,它支持存储的value类型相对更多,包括String(字符串),list(链表),set(集合),zset(sorted set --有序集合)和hash(哈希类型)
- 这些数据都支持push/pop、add/remove及取交集并集和差集及更多丰富的操作,而且这些操作都是原子性的。
- 在此基础上Redis支持各种不同方式的排序。
- 与memcached一样,为了保证效率,数据都是存在内存中的。
- 区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。
- 并且在此基础上实现了master-slave(主从)同步。
1.3 Redis的安装
1、首先从redis官网下载所需的安装包(Linux环境下的文件后缀为.tar.gz的文件)
2、下载完成后,将该文件上传到你的Linux下,放到你想放的目录下即可。
3、在安装redis的过程中,redis要求要有c语言的编译环境,所以直接安装一个gcc
yum install gcc
4、检查gcc是否安装成功
[root@bogon redis]# gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
出现上述的的情况,出现的一个gcc版本,就代表安装成功了
4、进入到你放redis压缩包的目录下,然后解压文件
tar -zxvf redis-redis-7.0.12.tar.gz
完成解压后会生成一个与压缩文件没有后缀的文件夹
这个时候我们进入到目录中,并使用make命令做一个编译,等待完成。
5、如果没有准备好c语言编译环境,make就会报错,—Jemalloc/jemalloc.h:没有那个文件
此时我们需要去检查gcc是否安装成功,如果没有就重新安装,如果安装成功就执行 make distclean,然后再进行make编译
6、使用make install
默认安装的目录是
cd /usr/local/bin
ll
-rwxr-xr-x. 1 root root 5205496 Jul 25 22:23 redis-benchmark
lrwxrwxrwx. 1 root root 12 Jul 25 22:23 redis-check-aof -> redis-server
lrwxrwxrwx. 1 root root 12 Jul 25 22:23 redis-check-rdb -> redis-server
-rwxr-xr-x. 1 root root 5422904 Jul 25 22:23 redis-cli
lrwxrwxrwx. 1 root root 12 Jul 25 22:23 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 11436712 Jul 25 22:23 redis-server
1.4Redis启动
(1)前台启动
进入到我们默认安装的目录/usr/local/bin
如下所示,就是前台启动,代表启动成功了。
[root@bogon bin]# redis-server
3140:C 31 Jul 2023 11:03:11.816 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3140:C 31 Jul 2023 11:03:11.816 # Redis version=7.0.12, bits=64, commit=00000000, modified=0, pid=3140, just started
3140:C 31 Jul 2023 11:03:11.816 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
3140:M 31 Jul 2023 11:03:11.817 * Increased maximum number of open files to 10032 (it was originally set to 1024).
3140:M 31 Jul 2023 11:03:11.817 * monotonic clock: POSIX clock_gettime
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 7.0.12 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 3140
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | https://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
3140:M 31 Jul 2023 11:03:11.818 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
3140:M 31 Jul 2023 11:03:11.818 # Server initialized
3140:M 31 Jul 2023 11:03:11.818 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
3140:M 31 Jul 2023 11:03:11.819 * Ready to accept connections
前台启动后,这个界面就不能操作了,如果关闭了这个界面,那么redis就关闭了,所以这种方法不适用。我们一般使用后台启动。
(2)后台启动
可以拷贝一份redis.conf到你想要的路径
首先需要进入到我们解压的redis文件夹下,然后拷贝redis.conf
cp redis.conf /etc/redis.conf
然后进入到我们拷贝的目录下,使用vm编辑器编辑redis.conf文件
将daemonize no
改为 daemonize yes
接下来我们就可以使用这个配置文件将redis后台启动了
还是需要进入我们默认安装的路径下
cd /usr/local/bin
[root@bogon bin]# redis-server /etc/redis.conf
[root@bogon bin]# ps -ef | grep redis
root 4911 1 0 13:30 ? 00:00:00 redis-server *:6379
root 4925 2751 0 13:31 pts/1 00:00:00 grep --color=auto redis
验证
[root@bogon bin]# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
(3)redis的关闭
单实例关闭
redis-cli shutdown
[root@bogon bin]# redis-server /etc/redis.conf
[root@bogon bin]# redis-cli shutdown
[root@bogon bin]#
多实例关闭,指定端口关闭
redis-cli -p 端口号 shutdown
[root@bogon bin]# redis-server /etc/redis.conf
[root@bogon bin]# ps -ef | grep redis
root 5081 1 0 13:44 ? 00:00:00 redis-server *:6379
root 5087 2751 0 13:44 pts/1 00:00:00 grep --color=auto redis
[root@bogon bin]# redis-cli -p 6379 shutdown
[root@bogon bin]#
二、基础知识
redis默认16个数据库,类似数组下标从0开始,初试默认使用的是0号库
那么我们可以使用select 来切换数据库
那么redis的底层实现是采用单线程+多路IO复用完成的
2.1 常用的五大数据类型
2.1.1 Redis键(key)
这里需要进入redis进行操作,开启redis,然后执行
/usr/local/bin/redis-cli
- 设置key,查看所有的key
set key 数据
keys *
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set key1 sun
OK
127.0.0.1:6379> set key2 gan
OK
127.0.0.1:6379> set keys guo
OK
127.0.0.1:6379> keys *
1) "key2"
2) "key1"
3) "keys"
- 判断某个key是否存在
exists key
127.0.0.1:6379> exists k1
(integer) 0
127.0.0.1:6379> exists key1
(integer) 1
127.0.0.1:6379>
- type key 卡看某个key的数据类型
127.0.0.1:6379> type key1
string
127.0.0.1:6379>
- 删除指定key的数据
del key
127.0.0.1:6379> del key1
(integer) 1
127.0.0.1:6379> exists key1
(integer) 0
127.0.0.1:6379>
- 根据value选择非阻塞删除,异步删除
unlink key
仅将keys从keyspace元数据中删除,真正的删除会在后续的异步操作
- 设置key的过期时间
expire key 时间
ttl key 查看还有多少秒过期
127.0.0.1:6379> expire key2 5
(integer) 1
127.0.0.1:6379> ttl key2
(integer) -2
其中-1表示永不过期,-2表示已经过期
2.1.2 select命令
select命令是用来切换数据库的命令,默认有16个库,默认的是0号库库是从0-15``
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> select 0
OK
127.0.0.1:6379>
2.2.3 dbsize
查看当前数据库的key的数量
127.0.0.1:6379> dbsize
(integer) 1
127.0.0.1:6379> set key1 22
OK
127.0.0.1:6379> dbsize
(integer) 2
127.0.0.1:6379>
2.1.4 清库
flushdb 清空当前库
flushall 通杀所有库
这两个命令要慎用!!!!
2.2 Redis 字符串(String)
2.2.1 简介
String是Redis最基本的数据类型,可以理解为与Memcached一摸一样的类型,一个key对应一个value,一个Redis中字符串value最多可以是512M。
String类型是一个二进制安全的。意味着Redis的String可以包含任何数据,比如图片或者序列化的对象。
2.2.3 常用命令
- 添加键值对
set key value
如果原来key有值就覆盖掉
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set k1 vip110
OK
127.0.0.1:6379> set ke vip 112
(error) ERR syntax error
127.0.0.1:6379> set k2 cip112
OK
- 查看key对应的值
get key
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> get k1
"vip110"
- 追加到原值的末尾
append key value
127.0.0.1:6379> append k1 hello
(integer) 11 #返回的是总长度
127.0.0.1:6379> get k1
"vip110hello"
127.0.0.1:6379>
- 获取key值的长度
strlen key
127.0.0.1:6379> strlen k1
(integer) 11
127.0.0.1:6379> get k1
"vip110hello"
127.0.0.1:6379>
- 添加键值对
setnx key value
只针对没有设置value才生效
- 将存储的数字增1或者减1
incr key 增1
decr key 减1
127.0.0.1:6379> set key1 20
OK
127.0.0.1:6379> get key1
"20"
127.0.0.1:6379> incr key1
(integer) 21
127.0.0.1:6379> decr key1
(integer) 20
127.0.0.1:6379>
- 增减固定值
incrby / decrby key 值
- 设置多个key value
mset k1 value1 k2 value2 …
- 获取多个key值
mget k1 k2 k3…
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> mset k1 hh k2 ww k3 xx k4 aa
OK
127.0.0.1:6379> keys *
1) "k4"
2) "k3"
3) "k2"
4) "k1"
127.0.0.1:6379> mget k1 k2 k3
1) "hh"
2) "ww"
3) "xx"
- 设置多个不存在的
msetnx
必须保证都不存在,一个存在key值就设置失败
- 获取给定索引范围的值
getrange key 起始位置(包前包后)
- 覆盖给定索引开始到后面的key值
set range key 开始位置 value
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> getrange name 0 3
"zhan"
127.0.0.1:6379> setrange name 7 hhh
(integer) 10
127.0.0.1:6379> get name
"zhangsahhh"
127.0.0.1:6379>
- 设置值的时候就开始设置过期的时间
setex key 过期时间 value
- 以新值换旧值
getset key vlaue
2.3 Redis列表(List)
2.3.1 简介
它的一个特点就是单键多值,Redis列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部或者尾部,它的底层实际上是一个双向链表,对两端的操作性能很高,操作中间的就会较差。
2.3.2 常用命令
-插值
lpush/rpush key value key1 value 2…
从左边或者右边插入一个或者多个
lpop/rpop
从左边或者右边吐出一个值
-操作两个列表
rpop|push key1 key2 从key1列表的右边取出一个值,插到key2列表的左边
2.3 Redis 集合(Set)
2.3.1 简介
Redis的set是String类型的无序集合,它的底层是一个value为null的hash表,所以添加,删除,查找的时间复杂度都是O(1)。
2.3.2 常用命令
- 添加元素
sadd key value1 value2
将一个或者多个member元素加入到集合key中,已经存在的member元素将被忽略
- 取出元素
smembers key
取出该集合中的所有值
- 判断集合中是否有某个值
sismember key value
判断key集合中是否含有value值,有就返回1,没有就返回0
- 返回集合中元素的个数
scard key
- 删除集合中的元素
srem key value1 value2
- 随机从集合中吐出一个值
spop key
-随机从集合中取出n个值
srandmember key n
取出,但是不会删除
- 移动元素
smove k1 k2 value
将k1中的值移到k2中
- 交集 并集 差集
sinter k1 k2
返回k1 k2集合中交集元素
sunio k1 k2
返回k1 k2 集合中的并集元素
sdiff k1 k2
返回集合中的差集元素,k1中有的,k2中没有的
2.4 Redis hash
2.4.1 简介
Redis hash是一个String类型的field和value的映射表,hash特别适合存储对象,类似与java中的Map<String,Object>
存储方式
2.4.2 常用的命令
- 用hset向hash里面添加数据
hset key filed value
- 在hash中取数据
hget key filed
- 批量添加
hmest key filed1 value1 filed2 value2…
- 查看是否存在
hexits key filed
三、配置文件的介绍
1、bind
修改相关的网络配置
首先使用vim编辑器打开我们的redis.conf文件,然后找到bind=127.0.0.1的这条命令,将这条命令注释起来,默认情况,也就是上述的这条命令,他代表我们只能接收本机的访问,那么我们后面进行整合的时候,使用idea工具进行连接才能成功连接。
2、protected-mode
搜索这个命令,然后将该命令的yes改为no,这样我们就可以支持远程访问了。
四、Redis的发布和订阅
4.1 发布与订阅的概念
Redis发布订阅(pub/sub)是一种消息通信模式,发送者(pub)发送消息,订阅者(sub)接收消息,Redis客户端可以订阅任意数量的频道。
1、客户端可以订阅频道如下
2、当这个频道发布消息后,消息就会发送给订阅的客户端
五、Redis三种新数据类型
Bitmaps
在开发中,可能会遇到这种情况:需要统计用户的某些信息,如活跃或不活跃,登录或者不登录;又如需要记录用户一年的打卡情况,打卡了是 1,没有打卡是0,如果使用普通的 key-value 存储,则要记录 365 条记录,如果用户量很大,需要的空间也会很大,所以 Redis 提供了 Bitmap 位图这中数据结构。
Bitmap 就是通过操作二进制位来进行记录,即只有为 0 和 1;如果要记录 365 天的打卡情况,使用 Bitmap 表示的形式大概如下:
0101000111000111...........................
这样有什么好处呢?当然就是节约内存了,365 天相当于 365 bit,又 1 字节 = 8 bit,所以相当于使用 46 个字节即可。
BitMap 就是通过一个 bit 位来表示某个元素对应的值或者状态,其中的 key 就是对应元素本身,实际上底层也是通过对字符串的操作来实现。Redis 从 2.2 版本之后新增了 setbit,getbit,bitcount 等几个 bitmap 相关命令。
Bitmaps 本身不是一种数据类型, 实际上它就是字符串(key-value),但是它可以对字符串的位进行操作。
指令
给偏移量设值(0 或 1)
setbit <key> <offset> <value>
实例:每个独立用户是否访问过网站存放在 Bitmaps 中,将访问的用户记做 1,没有访问的用户记做 0,用偏移量作为用户的 id。假设现在有 20 个用户,userid=1,6,11,15,19 的用户对网站进行了访问
127.0.0.1:6379> setbit user 1 1
(integer) 0
127.0.0.1:6379> setbit user 6 1
(integer) 0
127.0.0.1:6379> setbit user 11 1
(integer) 0
127.0.0.1:6379> setbit user 15 1
(integer) 0
127.0.0.1:6379> setbit user 19 1
(integer) 0
根据偏移量获取值
getbit <key> <offset>
示例:获取 id=8 的用户是否访问过, 返回 0 说明没有访问过
127.0.0.1:6379> getbit user 8
(integer) 0
bitcount [start end]统计字符串从 start 字节到 end 字节比特值为 1 的数量,start 和 end 代表起始和结束字节数
127.0.0.1:6379> bitcount user
(integer) 5
bitop 是一个复合操作,它可以做多个 Bitmaps 的 and(交集)、or(并集)、not(非)、xor(异或)操作并将结果保存在 destkey 中
operation:and(交集)、or(并集)、not(非)、xor(异或)
bitop <operation> <key1> <key2> ...
案例:计算出两天都访问过网站的用户数量
user:lastday:昨天用户数量的 key
user:today:今天用户数量的 key
bittop and users:and user:lastday user:today
三种新型的数据类型看这位博主优秀的博主