Redis中文官网:
Redis中文网https://www.redis.net.cn/
Redis 安装教程( Windows 版)
1. 下载安装包
https://robinliu.3322.org:8888/download/Redis-x64-3.2.100.msi
2. 安装注意事项
为了便于使用,在安装时, 强烈推荐勾选 Redis 安装到的文件夹添加到 Windows 的环境变量中 ,如
下图所示

安装过程中的其它选项均保持默认即可,如有疑问,可查看文末的“附:详细安装步骤”。

3. 注意事项
在 Windows 系统中,使用 .msi 安装包安装成功后, Redis 是默认已启动的,并会注册 Redis 服务,以后
每次开机,都会启动 Redis 服务,简单来说,安装成功后, Redis 将一直处于启动状态,除非你显式的关
闭了它。
注意:当安装完 Redis 后,如果你尝试在 IntelliJ IDEA 的终端或 CMD 窗口中执行 Redis 相关命令,必须
在安装 Redis 成后功,重新打开 IntelliJ IDEA CMD 窗口,否则,将无法读取到新的环境变量值,则无
法识别相关命令!
提示:无论是在 IntelliJ IDEA 的终端或 CMD 窗口中,执行的命令、得到的反馈是完全相同的。
提示:如果你的命令提示符之前有 PS 字样,表示你正在使用 Power Shell ,建议上网查阅相关资料,
将其关闭,再执行命令操作。
4. 登录 Redis 客户端 在终端( IntelliJ IDEA 的终端,或 CMD 窗口)执行 redis - cli 命令,即可登录Redis客户端:
如上图所示,登录成功后,你的提示符会变成 127.0.0.1:6379> ,则表示你已登录 Redis 客户端,在此
状态下,你可以执行任何 Redis 命令。
典型的检测 Redis 是否正常运行的命令是 ping ,当你执行此命令后,会得到 PONG 的反馈:

如果你的 Redis 未正常运行(例如你登录 Redis 客户端的时候是正常的,但是,随后 Redis 因为某些原因
停止工作了),执行 ping 命令时将无法得到正常的反馈,例如:
此时,你应该尝试在 Windows 的 “ 服务 ” 中将 Redis 设置为 “ 自动 ” 启动,并且,启用它!在 CMD 窗口中执行 services.msc 命令:

并确保Redis是“自动”的状态:

或者,你也可以在 Windows 终端下通过 redis - server 命令来启用 Redis (这并不能保证你每次开机时
Redis都是启动状态):
5. 停止 Redis 服务
如果你希望停止 Redis 服务,在登录到 Redis 客户端后,使用 shutdown 命令即可停止 Redis 服务,例 如:
如果你需要再次启用 Redis ,请参考以上 “4. 登录 Redis 客户端 ” 中的启用 Redis 服务的步骤。
附:详细安装步骤

关于Redis

Redis是一款基于内存的,使用K-V结构存储数据的NoSQL非关系型数据库。

  • 基于内存的:Redis将使用内存空间来存储数据,所以,读写效率非常高

    • 内存(RAM)是除了处理器内置缓存以外,存取效率最高的存储设备
    • 内存(RAM)中的数据会因为计算机断电而全部丢失,但Redis会自动将数据备份到硬盘,所以,存储到Redis中的数据并不会因为计算机断电而丢失
  • 使用K-V结构:Redis中的数据全部都是“键值对”,所以,存入每个数据都需要给数据指定一个唯一的名称,后续,也是通过这个名称来访问数据
  • NoSQL:可以是“无SQL”,或“No Operation SQL”,即“不操作SQL”,表现为Redis的使用完全不涉及SQL语句
  • 非关系型数据库:MySQL是典型的关系型数据库,数据库中可以有多张数据表,且表与表之间可以存在数据关联,所以称之为关系型数据库,包括MS SQL Server、Oracle等,都是关系型数据库,而Redis只是单纯使用K-V结构存储数据,存入的数据没有任何关系,Redis本身也不支持体现数据的关系,所以称之为非关系型数据库

Redis的数据类型

Redis虽然是使用简单的K-V结构存储数据,但是值的类型也有不同种类!

传统的Redis的数据类型有5种:string / list / set / hash / zset

另外,较高版本的Redis中还有3种新的数据类型:bitmap、getspatial(GEO)、hyperloglogs

Redis的基本命令

使用set key value可以存入简单的string数据,例如:

127.0.0.1:6379> set username wangkejing
OK

如果反复使用相同的Key,会覆盖前序存入的数据,例如:

127.0.0.1:6379> set username fanchuanqi
OK

经过以上2次操作,Redis中Key为username的值将是"fanchuanqi"

使用get key命令可以取出前序存入的string数据,例如:

127.0.0.1:6379> get username
"fanchuanqi"

如果使用的Key并不存在,将返回(nil),相当于Java中的null,例如:

127.0.0.1:6379> get user
(nil)

可以通过del key [key ...]命令删除数据,例如:

127.0.0.1:6379> del username
(integer) 1

以上删除操作,反馈的结果表示成功删除了几条数据。

可以通过keys pattern命令来查找当前已经存入的数据的Key,命令中的pattern表示查找的“模式”,例如:

127.0.0.1:6379> keys username1
1) "username1"
127.0.0.1:6379> keys username100
(empty list or set)

当“模式”匹配的Key存在时,将返回,如果不存在,则反馈(empty list or set)

在“模式”中,可以使用星号(*)作为通配符,例如:

127.0.0.1:6379> keys username*
1) "username3"
2) "username1"
3) "username2"
127.0.0.1:6379> keys *
1) "age1"
2) "age3"
3) "username1"
4) "username3"
5) "age2"
6) "username2"

可以使用flushdb清空当前库中的全部数据,例如:

127.0.0.1:6379> flushdb
OK

在项目中使用Redis编程

1.添加依赖

需要添加依赖项:

<!-- Spring Boot Data Redis -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2. 配置RedisTemplate

需要配置RedisTemplate对象,通过此对象的API来访问Redis!

在项目的根包下创建config.RedisConfiguration配置类,在此类中通过@Bean方法来配置RedisTemplate

@Slf4j
@Configuration
public class RedisConfiguration {@Beanpublic RedisTemplate<String, Serializable> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();redisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setValueSerializer(RedisSerializer.json());redisTemplate.setConnectionFactory(redisConnectionFactory);return redisTemplate;}}

可以通过测试学习RedisTemplate的常用操作:

package cn.tedu.csmall.product;import cn.tedu.csmall.product.pojo.entity.Brand;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;@Slf4j
@SpringBootTest
public class RedisTests {@AutowiredRedisTemplate<String, Serializable> redisTemplate;// 强烈建议下载 Another Redis Desktop Manager// 当需要对普通值(对应Redis中的string)进行操作时// 需要先调用opsForValue()方法,得到ValueOperations// 然后,调用ValueOperations对象的方法操作数据// 当需要对List(对应Redis中的list)进行操作时// 需要先调用opsForList()方法,得到ListOperations// 关于获取列表时range()方法中的start与end// 1. 这2个参数的值都表示元素在列表中的下标// 2. 各元素有正向下标,也有反向下标,正向下标是以第1个元素从0开始从左至右递增编号的,反向下标是以最后一个元素从-1开始从右至左递减编号的// 3. start元素必须不在end元素的右侧,否则获取不到数据// 4. 使用超出界限的下标并不会导致出错,实际获取效果将以可用的界限值为准// 注意:在项目正式上线的版本中,禁止调用keys()方法以查找Key!!!也禁止在Redis客户端中使用keys命令!!!@Testvoid valueSet() {String key = "username1";Serializable value = "wangkejing";ValueOperations<String, Serializable> ops = redisTemplate.opsForValue();ops.set(key, value);}@Testvoid valueGet() {String key = "username1";ValueOperations<String, Serializable> ops = redisTemplate.opsForValue();Serializable value = ops.get(key);log.debug("根据Key【{}】查询数据,结果:{}", key, value);}@Testvoid valueSetObject() {String key = "brand1";Brand brand = new Brand();brand.setName("大米");brand.setPinyin("dami");ValueOperations<String, Serializable> ops = redisTemplate.opsForValue();ops.set(key, brand);}@Testvoid valueGetObject() {String key = "brand1";ValueOperations<String, Serializable> ops = redisTemplate.opsForValue();Serializable value = ops.get(key);log.debug("根据Key【{}】查询数据,结果:{}", key, value);}@Testvoid keys() {String pattern = "*"; // keys *Set<String> keys = redisTemplate.keys(pattern);log.debug("根据模式【{}】查找Key,结果数量:{}", pattern, keys.size());for (String key : keys) {log.debug("Key = {}", key);}}@Testvoid delete() {String key = "username1";Boolean result = redisTemplate.delete(key);log.debug("根据Key【{}】执行删除,结果:{}", key, result);}@Testvoid deleteX() {Set<String> keys = new HashSet<>();keys.add("username1");keys.add("username2");keys.add("username3");keys.add("username4");keys.add("username5");Long count = redisTemplate.delete(keys);log.debug("根据Key【{}】执行删除,结果:{}", keys, count);}@Testvoid rightPush() {List<Brand> brands = new ArrayList<>();for (int i = 1; i <= 8; i++) {Brand brand = new Brand();brand.setName("品牌" + i);brands.add(brand);}String key = "brands";ListOperations<String, Serializable> ops = redisTemplate.opsForList();for (Brand brand : brands) {ops.rightPush(key, brand);}}@Testvoid listSize() {String key = "brands";ListOperations<String, Serializable> ops = redisTemplate.opsForList();Long size = ops.size(key);log.debug("获取Key【{}】的列表的长度,结果:{}", key, size);}@Testvoid listRange() {String key = "brands";long start = 5;long end = 2;ListOperations<String, Serializable> ops = redisTemplate.opsForList();List<Serializable> list = ops.range(key, start, end);log.debug("获取Key【{}】的列表中从【{}】到【{}】的数据,结果中数据的数量:{}",key, start, end ,list.size());for (Serializable item : list) {log.debug("{}", item);}}}

关于列表的使用,应该了解以下图示:

3. 使用原则

在项目中使用Redis有2大核心价值:

  • 提高查询数据的效率

    • 因为Redis的查询效率远高于MySQL等关系型数据库的查询效率
  • 保护关系型数据库
    • 由于绝大部分查询都是通过Redis查询来实现的,真正通过MySQL等关系型数据库的查询就非常少了,极大的缓解了MySQL这类服务器的压力,从而保护这类服务器

通常,向Redis中存入的数据具有这些特点:

  • 数据几乎不怎么发生变化,或变化的频率非常低,则很少出现数据不一致(MySQL与Redis中的数据不一致)的情况,例如:电商平台的类别、品牌
  • 可以不必过于关心数据的准确性,例如:热门视频的点赞数量

4. 缓存品牌列表

在开发实践中,通常建议将Redis的操作封装起来,便于后续调用。

在根包下创建repo.IBrandRedisRepository接口,并声明相关抽象方法:

package cn.tedu.csmall.product.repo;import cn.tedu.csmall.product.pojo.vo.BrandListItemVO;import java.util.List;/*** 处理品牌缓存的接口** @author java@tedu.cn* @version 0.0.1*/
public interface IBrandRedisRepository {/*** 品牌列表在Redis中的Key*/String BRAND_LIST_KEY = "brand:list";/*** 向Redis中写入品牌列表** @param brandList 品牌列表*/void save(List<BrandListItemVO> brandList);/*** 删除Redis中的品牌列表** @return 是否成功的删除了数据*/Boolean deleteList();/*** 从Redis中读取全部品牌的列表** @return 全部品牌的列表*/List<BrandListItemVO> list();/*** 从Redis中读取品牌列表** @param start 读取数据的起始下标* @param end   读取数据的结束下标* @return 指定区间的品牌列表*/List<BrandListItemVO> list(long start, long end);}

提示:在设计Key时,各单词之间建议使用冒号(:)进行分隔,这是一种大众用法,在许多Redis的可视化软件中,默认情况下,可以根据冒号分隔来将各个Key组织成文件夹的形式,当Key非常多时,显示效果更加友好。

然后,在根包下创建repo.impl.BrandRedisRepositoryImpl类,实现以上抽象方法:

package cn.tedu.csmall.product.repo.impl;import cn.tedu.csmall.product.pojo.vo.BrandListItemVO;
import cn.tedu.csmall.product.repo.IBrandRedisRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;@Slf4j
@Repository
public class BrandRedisRepositoryImpl implements IBrandRedisRepository {@Autowiredprivate RedisTemplate<String, Serializable> redisTemplate;public BrandRedisRepositoryImpl() {log.debug("创建缓存处理对象:BrandRedisRepositoryImpl");}@Overridepublic void save(List<BrandListItemVO> brandList) {ListOperations<String, Serializable> ops = redisTemplate.opsForList();for (BrandListItemVO brand : brandList) {ops.rightPush(BRAND_LIST_KEY, brand);}}@Overridepublic Boolean deleteList() {Boolean result = redisTemplate.delete(BRAND_LIST_KEY);return result;}@Overridepublic List<BrandListItemVO> list() {long start = 0;long end = -1;return list(start, end);}@Overridepublic List<BrandListItemVO> list(long start, long end) {ListOperations<String, Serializable> ops = redisTemplate.opsForList();List<Serializable> list = ops.range(BRAND_LIST_KEY, start, end);List<BrandListItemVO> brandList = new ArrayList<>();for (Serializable item : list) {brandList.add((BrandListItemVO) item);}return brandList;}}

完成后,在测试的根包下创建repo.BrandRedisRepositoryTests类,测试以上方法:

package cn.tedu.csmall.product.repo;import cn.tedu.csmall.product.mapper.BrandMapper;
import cn.tedu.csmall.product.pojo.vo.BrandListItemVO;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@Slf4j
@SpringBootTest
public class BrandRedisRepositoryTests {@AutowiredBrandMapper mapper;@AutowiredIBrandRedisRepository repository;@Testvoid save() {List<BrandListItemVO> brandList = mapper.list();repository.save(brandList);}@Testvoid deleteList() {Boolean result = repository.deleteList();log.debug("删除列表,结果:{}", result);}@Testvoid listAll() {List<BrandListItemVO> list = repository.list();log.debug("查询结果的数量:{}", list.size());for (BrandListItemVO item : list) {log.debug("{}", item);}}@Testvoid listRange() {long start = 2;long end = 5;List<BrandListItemVO> list = repository.list(start, end);log.debug("查询结果的数量:{}", list.size());for (BrandListItemVO item : list) {log.debug("{}", item);}}}

接下来,调整BrandServiceImpl中“查询品牌列表”的方法:

@Override
public List<BrandListItemVO> list() {log.debug("开始处理【查询品牌列表】的业务,无参数");// List<BrandListItemVO> list = brandMapper.list();List<BrandListItemVO> list = brandRedisRepository.list();return list;
}

则已经完成从Redis中查询品牌列表。

**注意:**需要事先在Redis中存入有效的品牌列表。

5. 缓存预热

缓存预热:当服务启动时就将缓存数据加载到缓存中。

在Spring Boot项目中,实现了ApplicationRunner的组件类中,重写的run()方法将在项目启动成功后自动运行。

提示:尽量可以在ApplicationRunner的实现类中调用BrandMapper对象和IBrandRedisRepository对象来处理缓存预热,但,这是不推荐的,原则上,只有Service允许调用Mapper对象、Repository对象,其它所有组件访问数据时只允许调用Service对象。

先在IBrandService中添加新的抽象方法:

/*** 重建缓存*/
void rebuildCache();

BrandServiceImpl中实现:

@Override
public void rebuildCache() {brandRedisRepository.deleteList();List<BrandListItemVO> list = brandMapper.list();brandRedisRepository.save(list);
}

然后,在项目的根包下创建preload.CachePreload类,实现缓存预热:

package cn.tedu.csmall.product.preload;import cn.tedu.csmall.product.service.IBrandService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class CachePreload implements ApplicationRunner {@Autowiredprivate IBrandService brandService;public CachePreload() {log.debug("创建开机自动启动对象:CachePreload");}// ApplicationRunner中的run()方法会在开机启动完成后的第一时间被自动调用@Overridepublic void run(ApplicationArguments args) throws Exception {log.debug("开始执行CachePreload.run()");brandService.rebuildCache();}}

6.计划任务

在Spring Boot项目中,当需要执行计划任务时,需要在配置类上添加@EnableScheduling注解,以全局开启计划任务!

则在项目的根包下创建config.ScheduleConfiguration类,添加此注解:

package cn.tedu.csmall.product.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;/*** 计划任务配置类** @author java@tedu.cn* @version 0.0.1*/
@Slf4j
@Configuration
@EnableScheduling
public class ScheduleConfiguration {public ScheduleConfiguration() {log.debug("创建配置类对象:ScheduleConfiguration");}}

然后,自定义组件类,在类中添加自定义方法,在方法上添加@Scheduled注解,并配置注解参数,例如配置fixedRate = 5000以表示此方法会每间隔5秒执行一次。

则在项目的根包下创建schedule.CacheSchedule以执行计划任务:

package cn.tedu.csmall.product.schedule;import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class CacheSchedule {@Scheduled(fixedRate = 5000)public void a() {log.debug("开始执行计划任务……");}}

具体的重建缓存可以配置为:

package cn.tedu.csmall.product.schedule;import cn.tedu.csmall.product.service.IBrandService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;/*** 更新缓存的计划任务类** @author java@tedu.cn* @version 0.0.1*/
@Slf4j
@Component
public class CacheSchedule {@Autowiredprivate IBrandService brandService;public CacheSchedule() {log.debug("创建计划任务对象:CacheSchedule");}// 关于@Schedule注解的参数配置// fixedRate:执行频率,将按照上一次开始执行的时间来计算下一次的执行时间,以毫秒为单位// fixedDelay:执行间隔时间,将按照上一次执行结束的时间来计算下一次的执行时间,以毫秒为单位// cron:使用1个字符串,是一个表达式,其中包括6~7个值,各值之间使用空格进行分隔// >> 在cron表达式中各值从左至右依次表示:秒 分 时 日 月 周(星期) [年]// >> 以上各值均可使用通配符// >> 使用星号(*)表示任意值// >> 使用问号(?)表示不关心具体值,问号只能用于“日”和“周(星期)”// >> 例如:"56 34 12 21 12 ? 2022"表示:2022年12月21日 12:34:56,且无视当天是星期几// >> 以上各值,可以使用"x/y"格式的值,例如:在分钟对应的位置设置1/5,则表示当分钟的值为1时执行,且每间隔5(分钟)执行一次// >> 关于cron表达式的更多内容,可以上网搜索【cron表达式】@Scheduled(fixedRate = 1 * 60 * 1000)public void rebuildBrandCache() {log.debug("开始执行【重建品牌缓存】计划任务……");brandService.rebuildCache();log.debug("本次【重建品牌缓存】计划任务执行完毕!");}}

关于Cron表达式的配置示例(原文链接:https://blog.csdn.net/weixin_40426638/article/details/78959972):

*/5 * * * * ? 每隔5秒执行一次
0 */1 * * * ? 每隔1分钟执行一次
0 0 5-15 * * ? 每天5-15点整点触发
0 0/3 * * * ? 每三分钟触发一次
0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点 0 0 12 ? * WED 表示每个星期三中午12点
0 0 17 ? * TUES,THUR,SAT 每周二、四、六下午五点
0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
0 0 23 L * ? 每月最后一天23点执行一次
0 15 10 L * ? 每月最后一日的上午10:15触发
0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
0 15 10 * * ? 2005 2005年的每天上午10:15触发
0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发"30 * * * * ?" 每半分钟触发任务
"30 10 * * * ?" 每小时的10分30秒触发任务
"30 10 1 * * ?" 每天1点10分30秒触发任务
"30 10 1 20 * ?" 每月20号1点10分30秒触发任务
"30 10 1 20 10 ? *" 每年10月20号1点10分30秒触发任务
"30 10 1 20 10 ? 2011" 2011年10月20号1点10分30秒触发任务
"30 10 1 ? 10 * 2011" 2011年10月每天1点10分30秒触发任务
"30 10 1 ? 10 SUN 2011" 2011年10月每周日1点10分30秒触发任务
"15,30,45 * * * * ?" 每15秒,30秒,45秒时触发任务
"15-45 * * * * ?" 15到45秒内,每秒都触发任务
"15/5 * * * * ?" 每分钟的每15秒开始触发,每隔5秒触发一次
"15-30/5 * * * * ?" 每分钟的15秒到30秒之间开始触发,每隔5秒触发一次
"0 0/3 * * * ?" 每小时的第0分0秒开始,每三分钟触发一次
"0 15 10 ? * MON-FRI" 星期一到星期五的10点15分0秒触发任务
"0 15 10 L * ?" 每个月最后一天的10点15分0秒触发任务
"0 15 10 LW * ?" 每个月最后一个工作日的10点15分0秒触发任务
"0 15 10 ? * 5L" 每个月最后一个星期四的10点15分0秒触发任务
"0 15 10 ? * 5#3" 每个月第三周的星期四的10点15分0秒触发任务

Redis(含Redis安装,CMD命令,使用Redis编程,缓存预热,计划任务)相关推荐

  1. Redis基础知识+安装+常用命令使用

    Redis NoSql概述 为什么用NoSql 单机MySQL的时代! 上古90年代,更多的是静态网页,动态交互类型的网站不多.一个基本网站访问量一般不会太大,单个数据库可以轻松应付. 现如今的大数据 ...

  2. Redis连接命令,Redis安全策略,Redis客户端(client)命令,Redis服务器命令

    目录 Redis连接命令详解 Redis连接命令 连接命令应用 Redis安全策略 命令配置密码 手动配置密码 指令安全 端口安全 SSH代理 Redis客户端(client)命令 Redis IO多 ...

  3. 关于安装cmd命令行安装pyinstaller库失败的解决方法

    我相信很多同学都是看了北京理工大学嵩老师的python教学视频,然后安装pyinstallet库: 用cmd命令行输入pip install pyinstaller进行安装 遗憾的是,我们都用cmd通 ...

  4. CMD命令清理电脑历史缓存和Cookies

    使用方法:清除Internet临时文件  RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8  清除Cookies  RunDll32.exe Inet ...

  5. redis的安装和命令的使用(史上最全命令集合)

    redis的安装和使用 1. redis介绍 1.1 什么是NoSQL NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题.目前一些主流的NOSQL 产品: ...

  6. redis集群安装和java应用

    首先是在linux下装redis3.0 以下是我在centos 6.5安装成功的.内容主要是http://redisdoc.com/topic/cluster-tutorial.html 的内容加上走 ...

  7. redis 服务器/客户端安装与配置

    redis 服务器/客户端安装与配置 1 redis server 1.1 获取redis源码包 //官网 http://redis.io/ wget -c http://redis.googleco ...

  8. Redis Mac下安装与使用

    目录 一.下载安装包 二.编译 三.服务端与客户端命令 1.服务端启动命令 2.客户端连接命令 3.服务端关闭命令 一.下载安装包 官网地址:http://redis.io/download 下载后, ...

  9. Java猿社区—Redis一篇系列—第二章、Redis入门和安装

    欢迎关注作者博客 简书传送门 专栏传送门:Redis深入学习之路 文章目录 2.Redis入门和安装 2.1.Redis是什么? 2.1.1.特性 2.2.能干嘛? 2.3.官方传送站 2.4.怎么玩 ...

最新文章

  1. ASI和AFN的区别
  2. Java面向对象(四)final关键字
  3. MySQL date_add()函数​​​​​​​
  4. html css3模拟心的跳动
  5. java:去除字符串中空格 、 oracle (+) 、 mysql中数值运算符和函数
  6. Java 线程池的实现原理,你真的理解吗?
  7. 年底各类年会邀请函也要美美的设计
  8. volley6--CacheDispatcher从缓存中获取数据
  9. android问卷分页显示,基于Android的问卷调查客户端题目分页加载实现.doc
  10. 钉钉微应用怎么进入_海目星激光张荣:激光焊接在锂电池生产应用中越来越多...
  11. 群晖系统设定定时NTP同步时间
  12. 3DMax和Maya到底哪个更牛B?
  13. 爬虫_app 2.7 packet capture抓包工具介绍
  14. dns远程服务器未响应,dns服务器未响应的解决方法
  15. 动手实践看懂深度学习的DP和DDP
  16. openwrt怎么做ap_终于把无线AP鸡肋的系统刷成openwrt,从此山鸡变凤凰!
  17. 《有限与无限的游戏》第五章 自然是不能言说者的王国:经典摘抄(1)
  18. 邻近算法(KNN)原理简单解析
  19. p2p mysql 数据的拆分 案例_浅析: P2P网贷系统数据库设计
  20. 最优化理论——可行方向法

热门文章

  1. 阶跃响应指标的matlab计算
  2. 数据库连接突然失败,必须重启服务器的解决办法
  3. 凡科的ns服务器如何修改,ns怎么把服务器设置成日服
  4. 谷歌和甲骨文的服务器宕机,如何解决
  5. KVM详解,教科书般的经典讲解
  6. Codec2Client::createComponent过程分析
  7. 瑞萨IDE:CS+ for CC新建工程配置方法
  8. YOLOv5改进Shuffle主干系列:高效结合ShuffleNet V2主干网络,高效CNN架构设计的实用指南
  9. CDN企业三分天下 共享模式独树一帜
  10. Vue自定义指令及实现图片懒加载指令