1.NoSQL数据库简介

作用:

解决IO压力

缓存数据库:减少io的读操作

  1. NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。
  2. NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。
  3. 不遵循SQL标准
  4. 不支持ACID
  5. 远超于SQL的性能

NoSQL适用场景

•对数据高并发的读写

•海量数据的读写

•对数据高可扩展性的

NoSQL不适用场景

•需要事务支持

•基于sql的结构化查询存储,处理复杂的关系,需要即席查询。

用不着sql的和用了sql也不行的情况,请考虑用NoSql

ØRedis

•几乎覆盖了Memcached的绝大部分功能

•数据都在内存中,支持持久化,主要用作备份恢复

•除了支持简单的key-value模式,还支持多种数据结构的存储,比如 list、set、hash、zset等。

•一般是作为缓存数据库辅助持久化的数据库

2.Redis简介安装

2.1下载地址

Redis官方网站:http://Redis.io

Redis中文官方网站:http://www.Redis.net.cn/

关于笔者此次安装版本:3.2.5 for Linux

不用考虑在windows环境下对Redis的支持

2.2安装步骤

  1. 下载获得redis-3.2.5.tar.gz后将它放入我们的Linux目录/opt

  2. 解压命令:tar -zxvf redis-3.2.5.tar.gz

  3. 解压完成后进入目录:cd redis-3.2.5

  4. 在redis-3.2.5目录下执行make命令

    未安装gcc就安装一下:
    yum -y install gcc
    yum -y install gcc-c++
  5. 安装完成后使用如下命令查看版本

    gcc -v
    g++ -v
  6. 在redis-3.2.5目录下再次执行make命令

    报错:Jemalloc/jemalloc.h:没有那个文件

    解决方案:运行make distclean之后再 make

  7. 在redis-3.2.5目录下再次执行make命令

Redis Test(可以不用执行)

  1. 执行完make后,跳过Redis test 继续执行make install

    查看默认安装目录:usr/local/bin

3.启动

  1. 备份redis.conf:拷贝一份redis.conf到其他目录

    # 在/root下创建文件夹
    mkdir myredis
    cp /opt/redis-3.2.5/redis.conf /root/myredis/
  2. 修改redis.conf文件将里面的daemonize no 改成 yes(128行),让服务在后台启动

    vim redis.conf
  3. 启动命令:执行

    redis-server   /root/myredis/redis.conf

    注意: 不加绝对路径的话还是用的默认配置文件或当前目录下的redis.conf

    查看状态:

    ps -ef | grep redis
  4. 用客户端访问: Redis-cli

    个端口可以 Redis-cli –p 6379

    redis-cli -p 6379
  5. 测试验证: ping

keys * 查询当前库的所有键

  1. 单实例关闭:Redis-cli shutdown

  2. 也可以进入终端后再关闭

多实例关闭,指定端口关闭:Redis-cli -p 6379 shutdown

相关知识:

默认16个数据库,类似数组下标从0开始,初始默认使用0号库

​ 使用命令 select <dbid> 来切换数据库。如: select 8

统一密码管理,所有库都是同样密码,要么都OK要么一个也连接不上

3.Redis五大数据类型

相关命令

参考链接:

https://www.redis.net.cn/tutorial/3506.html

https://blog.csdn.net/Huang_ZX_259/article/details/122718413

key

keys * ·查询当前库的所有键
exists s <key> ·判断某个键是否存在
type <key> ·查看键对应的值的类型
del <key> ·删除某个键

expire <key> <seconds 为键值设置过期时间,单位秒。

ttl <key> 查看还有多少秒过期,-1表示永不过期,
-2表示已过期

dbsize ·查看当前数据库的key的数量
Flushdb ·清空当前库
Flushall ·通杀全部库

String

  1. String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value
  2. String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
  3. String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M

原子性

Redis单命令的原子性主要得益于Redis的单线程

List

Ø单键多值

ØRedis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。

Ø它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

Set

Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动去重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)。

Hash

ØRedis hash 是一个键值对集合

ØRedis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象

Ø类似Java里面的Map<String,String>

zset (sorted set)

Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分(score) ,这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表

4.Redis相关配置

学习链接:https://www.redis.net.cn/tutorial/3504.html

这里仅介绍几个关键的:

  1. 大小写不敏感

  2. include:类似jsp中的include,多实例的情况可以把公用的配置文件提取出来

  3. ip地址的绑定(bind)

    ​ 默认情况bind=127.0.0.1只能接受本机的访问请求

    ​ 不写的情况下,无限制接受任何ip地址的访问

    ​ 生产环境肯定要写你应用服务器的地址

    ​ 如果开启了protected-mode,那么在没有设定bind ip且没有 设密码的情况下,Redis只允许接受本机的相应

  4. daemonize :是否为后台进程

5.Redis的java客户端Jedis

  1. Jedis所需要的jar包

    <dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/junit/junit -->
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
    </dependency>
  2. 用windows中的Idea连接虚拟机的Redis的注意事项

    禁用Linux的防火墙:Linux(CentOS7)里执行命令

    systemctl stop firewalld.service   

    /root/myredis/redis.conf中注释掉bind 127.0.0.1(61行) ,然后 protect-mode no(80行)。

  3. Jedis测试连通性

@Test
public void testConnection(){
//创建Jedis对象
Jedis jedis = new Jedis("192.168.6.100",6379);
//查看服务是否运行,打出pong表示OK
System.out.println("connection is OK==========>: "+jedis.ping());

}

6.通过Jedis操作Redis

初始keys *

注:此处第二个原因是redis template向redis存放使用java对象序列化的值,序列化方式和string的一般方式不同。

笔者懒得动了,仅给出参考解决链接:

https://blog.csdn.net/qq_16159433/article/details/121491555

package com.atguigu.redis;

import org.junit.Test;
import redis.clients.jedis.Jedis;

import java.util.Set;

/**
* @author wh
* @CREATE 2023/6/13 16:33
*/
public class TestJedis {
//创建Jedis对象
Jedis jedis = new Jedis("192.168.6.100",6379);

@Test
public void testConnection(){
//查看服务是否运行,打出pong表示OK
System.out.println("connection is OK==========>: "+jedis.ping());

}

@Test
public void testJedis(){
//获取所有的key
Set<String> keys = jedis.keys("*");
System.out.println("所有的key是:"+ keys);
//获取k1的值
String k1 = jedis.get("k1");
System.out.println(k1);
//设置一个k2
jedis.set("k2","v2");
//设置多个值
jedis.mset("k3","v3","k4","v4","k5","v5");
//当key不存在时设置k6
jedis.setnx("k6","v6");
}

执行后keys *