Redis技术

article/2025/3/18 22:09:08

一.基本知识

(1)NoSQL数据库简介

技术的分类:
1、解决功能性的问题:Java、Jsp、RDBMS、Tomcat、HTML、Linux、JDBC、SVN
2、解决扩展性的问题:Struts、Spring、SpringMVC、Hibernate、Mybatis
3、解决性能的问题:NoSQL、Java线程、Hadoop、Nginx、MQ、ElasticSearch
用这个NoSQL数据库有什么好处吗?
1.能解决CPU和内存压力:比如可以将session信息存到这个缓存数据库,某个服务器想要信息的时候就可以从和这个缓存数据库里面取。
2.缓解IO压力:将需要频繁查询的数据放到缓存数据库中。
该数据库的介绍?
       “Not Only SQL” 泛指非关系型数据库。以key-value的形式来存储数据。它的特点是:不遵循SQL标准;不支持ACID;远超SQL的性能。他适用于对数据高并发的读写(秒杀功能),海量数据的读写,对数据高可扩展。这类数据库有:Memcache,Redis,MongoDB。
redis的概述和安装
        Redis是一个开源key-value存储系统,支持五种value类型,这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。他还支持不同方式的排序。为了保证效率,数据都是存储在缓存中,但是会周期性地将数据写进磁盘,并在此基础上实现了master-slave同步。
       官方网站:http:/redis.io
      中文网:http://www.redis.net.cn/
       安装的话需要Linux的环境
       这里我们先用windows的,直接解压缩就好:
                redis.windows.conf:配置文件
                redis-cli.exe:redis的客户端
                redis-server.exe:redis服务器端

(2)命令操作

        1.redis的数据结构:
                redis存储的是:key,value格式的数据,其中key是字符串,value有5种不同的数据结构
                value的数据结构:
                        1) 字符串类型 string
                        2) 哈希类型 hash : map格式 
                        3) 列表类型 list : linkedlist格式。支持重复元素
                        4) 集合类型 set  : 不允许重复元素
                        5) 有序集合类型 sortedset:不允许重复元素,且元素有顺序

        2. 字符串类型 string
                存储: set key value
                获取: get key
                删除: del key

        3. 哈希类型 hash
                存储: hset key field value
                获取:hget key field: 获取指定的field对应的值
                           hgetall key:获取所有的field和value
                删除: hdel key field

        4. 列表类型 list:   可以添加一个元素到列表的头部(左边)或者尾部(右边)
                添加:lpush key value: 将元素加入列表左表
                           rpush key value:将元素加入列表右边
                获取:lrange key start end :范围获取
                删除:lpop key: 删除列表最左边的元素,并将元素返回
                           rpop key: 删除列表最右边的元素,并将元素返回

        5. 集合类型 set : 不允许重复元素
                存储:sadd key value
                获取:smembers key:获取set集合中所有元素
                删除:srem key value:删除set集合中的某个元素  

        6. 有序集合类型 sortedset:不允许重复元素,且元素有顺序.每个元素都会关联一个double
        类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
                存储:zadd key score value
                获取:zrange key start end [withscores]
                删除:zrem key value

        7. 通用命令
                keys * : 查询所有的键
                type key : 获取键对应的value的类型
                del key:删除指定的key value

(3)持久化

        1. redis是一个内存数据库,当redis服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
        2. redis持久化机制:
                RDB:默认方式,不需要进行配置,默认就使用这种机制。在一定的间隔时间中,检测
                            key的变化情况,然后持久化数据
                          1)编辑redis.windwos.conf文件
                                #   after 900 sec (15 min) if at least 1 key changed
                                save 900 1
                                #   after 300 sec (5 min) if at least 10 keys changed
                                save 300 10
                                #   after 60 sec if at least 10000 keys changed
                                save 60 10000
                           2)重新启动redis服务器,并指定配置文件名称,进入redis安装目录,用该命令
                                打开: redis-server.exe redis.windows.conf 
                AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化
                           数据
                            1)编辑redis.windwos.conf文件
                                 appendonly no(关闭aof) --> appendonly yes (开启aof)
                                 # appendfsync always : 每一次操作都进行持久化
                                appendfsync everysec : 每隔一秒进行一次持久化
                                # appendfsync no     : 不进行持久化

二.Jedis

        1.快速入门

                1)首先要导jar包

                    
                2)然后就可以写代码了

import org.junit.Test;
import redis.clients.jedis.Jedis;
public class demo1 {@Testpublic  void test(){//1. 获取连接Jedis jedis = new Jedis("localhost",6379);//2. 操作jedis.set("username","zhangsan");System.out.println(jedis.get("username"));//3. 关闭连接jedis.close();}
}

         2.String数据类型     

import org.junit.Test;
import redis.clients.jedis.Jedis;
public class demo1 {@Test//String数据结构public void test2(){//1. 获取连接Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口//2. 操作//存储jedis.set("username","zhangsan");//获取String username = jedis.get("username");System.out.println(username);//可以使用setex()方法存储可以指定过期时间的 key valuejedis.setex("activecode",20,"hehe");//将activecode:hehe键值对存入redis,并且20秒后自动删除该键值对//3. 关闭连接jedis.close();}
}

        3.Map数据类型         

import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.Map;
import java.util.Set;public class demo1 {@Test//String数据结构public void test2(){//1. 获取连接Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口//2. 操作// 存储hashjedis.hset("user","name","lisi");jedis.hset("user","age","23");jedis.hset("user","gender","female");// 获取hashString name = jedis.hget("user", "name");System.out.println(name);// 获取hash的所有map中的数据Map<String, String> user = jedis.hgetAll("user");Set<String> keySet = user.keySet();for (String key : keySet) {//获取valueString value = user.get(key);System.out.println(key + ":" + value);}//3. 关闭连接jedis.close();}
}

        4.List数据结构

import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.List;
public class demo1 {@Test//String数据结构public void test2(){//1. 获取连接Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口//2. 操作// list 存储jedis.lpush("mylist","a","b","c");//从左边存jedis.rpush("mylist","a","b","c");//从右边存// list 范围获取List<String> mylist = jedis.lrange("mylist", 0, -1);System.out.println(mylist);// list 弹出String element1 = jedis.lpop("mylist");//cSystem.out.println(element1);String element2 = jedis.rpop("mylist");//cSystem.out.println(element2);// list 范围获取List<String> mylist2 = jedis.lrange("mylist", 0, -1);System.out.println(mylist2);//3. 关闭连接jedis.close();}
}

        5.Set数据结构

import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.Set;
public class demo1 {@Test//String数据结构public void test2(){//1. 获取连接Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口//2. 操作// set 存储jedis.sadd("myset","java","php","c++");// set 获取Set<String> myset = jedis.smembers("myset");System.out.println(myset);//3. 关闭连接jedis.close();}
}

        6.sortedset数据结构

import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.Set;public class demo1 {@Test//String数据结构public void test2() {//1. 获取连接Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口//2. 操作// sortedset 存储jedis.zadd("mysortedset", 3, "亚瑟");jedis.zadd("mysortedset", 30, "后裔");jedis.zadd("mysortedset", 55, "孙悟空");// sortedset 获取Set<String> mysortedset = jedis.zrange("mysortedset", 0, -1);System.out.println(mysortedset);//3. 关闭连接jedis.close();}
}

        7.Jedis连接池,和工具类

import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;public class demo1 {@Test//String数据结构public void test2() {//0.创建一个配置对象JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(50);//最大数量config.setMaxIdle(10);//1.创建Jedis连接池对象JedisPool jedisPool = new JedisPool(config,"localhost",6379);//2.获取连接Jedis jedis = jedisPool.getResource();//3. 使用jedis.set("hehe","heihei");System.out.println(jedis.get("hehe"));//4. 关闭 归还到连接池中jedis.close();}
}

 

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;public class JedisPoolUtils {private static JedisPool jedisPool;static{//读取配置文件InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");//创建Properties对象Properties pro = new Properties();//关联文件try {pro.load(is);} catch (IOException e) {e.printStackTrace();}//获取数据,设置到JedisPoolConfig中JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));//初始化JedisPooljedisPool = new JedisPool(config,pro.getProperty("host"),Integer.parseInt(pro.getProperty("port")));       }/*** 获取连接方法*/public static Jedis getJedis(){return jedisPool.getResource();}
}

三.SpringBoot集成

        1.快速入门

                1)首先导入redis的启动器依赖

        <!--引入redis的环境--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-test</artifactId><version>2.2.4.RELEASE</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.2.3.RELEASE</version></dependency>

                2)配置配置文件,redis启动需要

spring:redis:port: 6379host: localhost

                3)测试代码,要保证redis的服务端启动


import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
import org.junit.runner.RunWith;@RunWith(SpringRunner.class)
@SpringBootTest
public class redisTest {@Resourceprivate RedisTemplate redisTemplate;@Testpublic void test(){//字符串redisTemplate.boundValueOps("string").set("萧萧");//存储System.out.println(redisTemplate.opsForValue().get("string"));//查询//散列redisTemplate.boundHashOps("user").put("name","雪蝶梨");//存储redisTemplate.boundHashOps("user").put("age",14);Set keys = redisTemplate.boundHashOps("user").keys();System.out.println("散列所有的键是"+keys);List values = redisTemplate.boundHashOps("user").values();System.out.println("散列所有的值是"+values);//List列表redisTemplate.boundListOps("myList").leftPush("c");//存储redisTemplate.boundListOps("myList").leftPush("b");redisTemplate.boundListOps("myList").leftPush("a");List myList = redisTemplate.boundListOps("myList").range(0, -1);//查询System.out.println(myList);//set集合redisTemplate.boundSetOps("mySet").add("a","b","c");//存储Set mySet = redisTemplate.boundSetOps("mySet").members();//查询System.out.println(mySet);//sorted set集合redisTemplate.boundZSetOps("my_sorted_set").add("a",10);//存储redisTemplate.boundZSetOps("my_sorted_set").add("b",20);redisTemplate.boundZSetOps("my_sorted_set").add("c",30);Set my_sorted_set = redisTemplate.boundZSetOps("my_sorted_set").range(0, -1);//查询System.out.println(my_sorted_set);}
}


http://chatgpt.dhexx.cn/article/QQmqbY9I.shtml

相关文章

《Redis系列专题》 之 大规模互联网应用Redis架构要点(精华)

建议有一定工作经验者阅读 通常&#xff0c;为了提高网站响应速度&#xff0c;总是把热点数据保存在内存中而不是直接从后端数据库中读取。Redis是一个很好的Cache工具。大型网站应用&#xff0c;热点数据量往往巨大&#xff0c;几十G上百G是很正常的事儿&#xff0c;在这种情况…

大数据互联网架构阶段 Redis(二)

Redis(二) 零 、 目录 将缓存引入电商项目主从复制哨兵模式集群容忍度CAP理论 十、 将缓存引入电商项目 使用Spring框架维护Jedis池对象 引入一个配置文件 application-redis.config <beans xmlns"http://www.springframework.org/schema/beans"xmlns:context&…

大数据下Redis的应用

大数据下Redis的应用 1、Redis客户端区别 1.1 redis常用客户端 目前市面上比较流行的客户端有jedis、lettuce、redisson •jedis jedis客户端连接方式是基于TCP阻塞方式 •lettuce lettuce内部是基于netty的多路复用异步非阻塞方式&#xff08;目前业界解决高并发大数据的问…

redis互联网真实应用场景

Redis 1.数据类型&#xff08;5种&#xff09; String、hash、list、set、zset 2.常用命令 2.1 String 分布式锁 SETNX 当别的进程枷锁后 讲不能获得锁 利用INCR来产生分布式序列号&#xff0c;优化策略&#xff1a;一下拿出多个序列号到服务器本地&#xff0c;之后在服务器…

大规模互联网应用Redis架构要点(转)

通常&#xff0c;为了提高网站响应速度&#xff0c;总是把热点数据保存在内存中而不是直接从后端数据库中读取。Redis是一个很好的Cache工具。大型网站应用&#xff0c;热点数据量往往巨大&#xff0c;几十G上百G是很正常的事儿&#xff0c;在这种情况下&#xff0c;如何正确架…

Redis 为什么在互联网应用中广泛应用?

1. redis 都能干嘛 缓存&#xff0c;毫无疑问这是Redis当今最为人熟知的使用场景。再提升服务器性能方面非常有效&#xff1b;排行榜&#xff0c;在使用传统的关系型数据库&#xff08;mysql oracle 等&#xff09;来做这个事儿&#xff0c;非常的麻烦&#xff0c;而利用Redis…

从 Redis7.0 发布看 Redis 的过去与未来

前言 经历接近一年的开发、三个候选版本&#xff0c;Redis 7.0终于正式发布&#xff0c;这是Redis历史上改变最多的一个大版本&#xff0c;它不仅包含了50多个新命令&#xff0c;还有大量核心新特性与改进&#xff0c;这些不仅能够解决用户使用中的诸多问题&#xff0c;还进一…

Redis简介

​强烈推荐一个大神的人工智能的教程&#xff1a;http://www.captainai.net/zhanghan 【前言】 组长反复提到系统加载的慢性能有待提高&#xff0c;正好这两天任务都提前完成&#xff1b;于是乎开始着手研究Redis&#xff1b;经过两天的研究将Redis应用到了系统中并做了相关的…

旅游专题图制作

一 数据源 从网上下载的全国各行政区域矢量图层、福建省九市矢量边界图、福建省公路矢量图、福建省河流矢量图、福建省铁路矢量图&#xff0c;其中&#xff0c;它们的投影坐标系为WGS84投影坐标系以及福建省2018旅游景点图。 二&#xff0e;专题地图设计过程 1.打开Arcgis 10…

使用Arcgis制作的专题地图

使用Arcgis制作的专题地图 一、数据准备二、简单制作1. 将数据拉入图层2. 切换视图3. 插入标题4. 插入图例5. 插入指北针6. 插入比例尺 三、精细制作1. 插入文本2. 插入动态文本3. 调整元素4. 调整符号5. 开启格网 五、结果图六、导出地图 一、数据准备 自己准备数据 二、简单…

ArcGIS Pro 专题图制作

基于昨天已经符号化好的地图基础之上&#xff0c;今天主要操作一下专题图制作。ArcGIS Pro中专题图制作和Map中已经有了很大的改动&#xff0c;只要能够习惯ArcGIS Pro制图的方式&#xff0c;那制作的专题图比Map还是更加漂亮的&#xff0c;因为它提供的元素样式&#xff0c;文…

ArcGIS 10.5专题地图制作自定义漂亮图框

先来看一下效果: 下面来说明如何在ArcGIS软件里面实现自定义图框。 1. 【自定义】→【样式管理器】→【Administrator.style】→【边框】→【新建】→【常规边框】。 2. 点击【更改符号】。 3. 点击【编辑符号】。

利用envi与arcmap/arcgisPro制作一张植被覆盖指数专题地图(地图学作业)

利用envi与arcmap/arcgisPro制作一张植被覆盖指数专题地图&#xff08;地图学作业&#xff09; 前言数据准备利用envi进行数据处理Lc8数据的打开辐射定标图像裁剪大气校正Band Math获取NDVI计算植被覆盖指数 ArcMap or ArcGIS Pro成图导入tif文件并将其可视化 前言 本篇文章是…

ArcGIS制作专题地图

终于制出我想要的效果地图了 一顿摸索 从昨天到现在 呵呵 功夫不负有心人 特别是九段线数据框 因为完全是自己摸索 还是小小激动下 也记录一下 上图

QGIS创建专题地图

支持创建多种专题图&#xff0c;单符号专题图、分类专题图、渐进专题图&#xff08;数值分段&#xff09;、自定义规则专题图等、热力图、汇聚图、2.4D三维图&#xff1b;以分类专题图制作为例&#xff0c;操作如下&#xff1a; 制作专题地图 选择符号页签&#xff1b;2.选择…

如何制作专题地图集

你可能看到过类似下图的地图&#xff0c;作为一个GISer&#xff0c;有没有想过这些图是怎么做出来的。对ArcMap也很熟悉了&#xff0c;但是看到这些地图&#xff0c;第一感觉是用PS或是AI做的。即使ArcMap可以做出这些图&#xff0c;也是一个很麻烦的过程&#xff0c;或许Pytho…

ArcGIS应用基础4 专题图的制作

&#x1f388;&#x1f388;&#x1f388;本文数据免费下载 &#x1f3af;&#x1f3af;&#x1f3af;其他GIS空间分析文章 本次实验数据基于上次实验3结果进行处理&#xff0c;文章见ArcGIS应用基础3 人口密度图的制作 一、实验名称 ArcGIS应用基础之专题图的制作 二、实验目…

(附word操作以及视频讲解)使用ARCGIS进行地图配准_投影变换_普通地图制作_专题地图制作

目录 1、这里需要说明的是&#xff0c;视频是由成都信息工程大学龙银平老师制作&#xff0c;Word是由本人编辑。 2、外加 实验指导书 3、链接&#xff1a;https://pan.baidu.com/s/1XgULO8zy5fqlbC1aUXSiLg 提取码&#xff1a;Love 4、部分成果展示&#xff1a; 5. 普通地…

如何制作专题地图(设计、规划、测绘制作图斑)标绘使用详解

同步视频教程&#xff1a;制作专题地图-设计规划测量地图应用详解-Bigemap GIS Office 专题地图制作视频教程&#xff1a;地图数据应用&#xff08;地形图制作过程&#xff09;-Bigemap GIS Office 1、导入/导出AutoCAD文件DXF格式 2、在线标注含有 点 线 面 的矢量标注&#x…

专题地图符号设计与构图

专题地图符号设计是地图编制与可视化的重点内容之一。 一、符号设计应遵循的原则 符号设计应遵循多种原则&#xff0c;包括图案化、精确性、逻辑性、系统性、对比性和协调性、色彩的象征性、视力与制印条件、印刷与经济效果和计算机制图的需要等。 图案化 地图符号图形的设计…