Java---(详细入门级)项目经常用的Redis到底是什么???----- 基础知识整理

Redis

1.Redis简介

  • redis是一款高性能的NOSQL(Not Only Sql)系列的非关系型数据库
  • 为什么要使用Redis这类非关系型数据库呢?
    • 首先我们要知道以下的知识点
      • 关系型数据库:
        • 数据之间有关联关系
        • 数据存放在硬盘中
      • 非关系型数据库:
        • 数据之间没有关联关系
        • 数据存放在内存中
      • 我们都知道,操作关系型数据库是非常耗时间的,因为它是每次都要从硬盘上读取的
      • 因此在一些经常需要查询的时候,并且这个数据不经常发生改变,我们还用关系型数据库的话,就显得有些过于愚蠢了,不仅会浪费大量的系统资源,还会让用户的体验感极差。
      • 这个时候我们就需要使用到redis了,它是运用了缓存的思想
        在这里插入图片描述
  • 这里简单说一下,关系型数据库和非关系型数据库:
    • 非关系型数据库(NOSQL, not only sql),意即不仅仅是sql,是一项全新的数据库理念,泛指非关系型的数据库
    • NOSQL和关系型数据库的比较:
      • 优点:
        • 1.成本:nosql数据库简单易部署,基本都是开源软件
        • 2.查询速度:nosql数据库将数据存储在缓存之中,关系型数据库存储在硬盘之中,nosql肯定要比其快得多
        • 3.存储数据的格式:nosql的存储格式为key:value的形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等,而关系型数据库只能存基础类型
        • 4.扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很难
      • 缺点:
        • 1.不提供对sql的支持
        • 2.一般不提供关系型数据库这种对事务的支持
        • 3.存在数据丢失的情况
    • 对于这两类数据库实际上是互补的,对方的优点就是自己的缺点。主要看实际的用途。
    • 一般将数据存储在关系型数据库中,在nosql数据库中进行一个备份
  • redis是用c语言开发的,目前为止redis支持的键值数据类型如下:
    • 1.字符串类型 String
    • 2.哈希类型 hash
    • 3.列表类型 list
    • 4.集合类型 set
    • 5.有序集合类型 sortedset
    • 6.位图
    • 7.hyperloglogs
  • redis的应用场景:
    • 缓存(数据查询,短链接,新闻内容,商品内容等等)
    • 聊天室的在线好友列表
    • 任务队列(秒杀,抢购)
    • 应用排行榜
    • 网站访问统计
    • 数据过期处理(可以精确到毫秒)
    • 分布式集群架构中的session分离

2.下载安装

  • 官网:https://redis.io/
  • 中文网:https://www.redis.net.cn/
  • 可以去中文网下载,速度更快(网好忽略),下好直接解压就可以使用
  • 其中的几个文件:
    • redis.windows.conf:配置文件
    • redis-cli.exe:客户端
    • redis-server.exe:服务器端

3.命令操作

3.1数据结构

  • key都是字符串类型,value可以是上述的类型,这里给出一张图
    在这里插入图片描述

3.2常用命令(可以去中文网的redis教程去看)

  • 1.字符串类型(String)
    • 存储:set key value
    • 获取:get key
    • 删除:del key
  • 2.hash类型
    • 存储:hset key field value
    • 获取:
      • 1.获取单个 hget key field
      • 2.获取全部 hgetall key
    • 删除:hdel key
  • 示例
//上述两个在一起
127.0.0.1:6379> set username zhangsan
OK
127.0.0.1:6379> get username
"zhangsan"
127.0.0.1:6379> set age 23
OK
127.0.0.1:6379> set age 33
OK
127.0.0.1:6379> get age
"33"
127.0.0.1:6379> del age
(integer) 1
127.0.0.1:6379> get age
(nil)
127.0.0.1:6379> hset myhash username ls
(integer) 1
127.0.0.1:6379> hset myhash password 123
(integer) 1
127.0.0.1:6379> hget myhash username
"ls"
127.0.0.1:6379> hgetall myhash
1) "username"
2) "ls"
3) "password"
4) "123"
127.0.0.1:6379> hdel myhash username
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "password"
2) "123"
  • 3.列表类型(LinkedList): 可以添加元素到列表的头部或者尾部(左右)
    • 添加:
      • lpush key value:向列表头部添加元素,有新的还是往头加
      • rpush key value:向尾部…
    • 获取:
      • lrange key start end:范围获取
    • 删除:
      • lpop key:删除最左边的元素,并将元素返回
      • rpop key:删除最右边的元素,并将元素返回
    • 示例
127.0.0.1:6379> lpush mylist a
(integer) 1
127.0.0.1:6379> lpush mylist b
(integer) 2
127.0.0.1:6379> rpush mylist c
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> lpop mylist
"b"
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "c"
127.0.0.1:6379> rpop mylist
"c"
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
  • 4.集合类型(set):不允许重复元素
    • 1.存储:sadd key value
    • 2.获取:
      • smembers key:获取set集合中的所有元素
    • 3.删除
      • srem key value:删除set集合中的某个元素
    • 示例:
127.0.0.1:6379> sadd myset a
(integer) 1
127.0.0.1:6379> sadd myset a
(integer) 0
127.0.0.1:6379> snumbers myset
(error) ERR unknown command 'snumbers'
127.0.0.1:6379> smembers myset
1) "a"
127.0.0.1:6379> sadd myset b c d
(integer) 3
127.0.0.1:6379> smembers myset
1) "c"
2) "a"
3) "d"
4) "b"
127.0.0.1:6379> arem myset a
(error) ERR unknown command 'arem'
127.0.0.1:6379> srem myset a
(integer) 1
127.0.0.1:6379> smembers myset
1) "c"
2) "d"
3) "b"
  • 5.有序集合(sortedset):不允许元素重复,且元素有序(排行榜)
    • 存储:zadd key score value
    • 获取:zrange key start end
    • 删除:zrem key value
  • 示例
127.0.0.1:6379> zadd mysort 60 zhangsan
(integer) 1
127.0.0.1:6379> zadd mysort 50 lisi
(integer) 1
127.0.0.1:6379> zadd mysort 80 wangwu
(integer) 1
127.0.0.1:6379> zrange mysort 0 -1
1) "lisi"
2) "zhangsan"
3) "wangwu"
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "lisi"
2) "50"
3) "zhangsan"
4) "60"
5) "wangwu"
6) "80"
127.0.0.1:6379> zadd mysort 500 lisi
(integer) 0
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "zhangsan"
2) "60"
3) "wangwu"
4) "80"
5) "lisi"
6) "500"
127.0.0.1:6379> zrem mysort lisi
(integer) 1
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "zhangsan"
2) "60"
3) "wangwu"
4) "80"
  • 6.通用的一些命令:
    • 1.keys *:获取所有的键key
    • 2.type key:获取key的类型
    • 3.del key:删除指定的key value

4.持久化操作

  • redis是一个内存数据库,当redis服务器重启,或者电脑重启时,redis中的数据会丢失,为了解决这个问题,我们可以将redis中的数据持久化保存到硬盘中去
  • redis持久化的机制:
    • RDB:默认方式,不需要进行配置,默认就是用这种机制(推荐)

      • 在一定的间隔时间内,检测key的变化,然后持久化数据
        在这里插入图片描述
    • AOF:日志记录的方式,可以记录每一条命令的操作,然后持久化(不推荐,对性能有一定的影响)
      在这里插入图片描述

5.使用Java客户端操作redis

  • jedis:一款java操作数据库的工具
    • 使用步骤:
    • 下载jedis的jar包
    • 使用
//1.获取连接,如果是空参的话,默认就是localhost 和端口号6379
Jedis jedis = new Jedis("localhost", 6379);
//2.操作
jedis.set("username", "zhangsan");
//3.关闭连接
jedis.close();
  • jedis操作各种redis中的数据结构
    • 1.字符串类型 String
      • set
      • get
Jedis jedis = new Jedis();
jedis.set("username", "zhangsan");
String value = jedis.get("username");
//可以使用jedis中的setex方法存储指定过期时间的key value
//它是将activecode:hehe 存入redis中,20秒后会自动删除该键值对
jedis.setex("activecode", 20, "hehe");
jedis.close();
- 2.哈希类型 hash
	- hset
	- hget /hgetAll
Jedis jedis = new Jedis();
jedis.hset("user", "name", "zhangsan");
jedis.hset("user", "age", "21");
String value = hget("user", "name");//zhangsan
Map<String, String> user = jedis.hgetAll("user");//返回一个map集合

jedis.close();
- 3.列表类型 list
	- lpush/rpush
	- lpop/rpop
	- lrange start end:范围获取	
Jedis jedis = new Jedis();
jedis.lpush("mylist", "a", "b", "c");
jedis.rpush("mylist", "a", "b", "c");
//范围获取
List<String> myList = jedis.lrange("mylist", 0, -1);//获取全部
String element1 = jedis.lpop("mylist");
String element2 = jedis.rpop("mylist");

jedis.close();
- 4.集合类型 set
	- sadd
	- smembers:获取全部
jedis.sadd("myset", "java", "cpp", "cpp");
Set<String> myset = jedis.smembers("myset");//java, cpp
- 5.有序集合类型 sortedset
	- zadd 
	- zrange:范围获取
jedis.zadd("mysortedset", "10", "亚瑟");
jedis.zadd("mysortedset", "30", "后羿");
jedis.zadd("mysortedset", "20", "花木兰");

Set<String> set = jedis.zrange("mysortedset", 0, -1);
// 亚瑟, 花木兰, 后羿
  • jedis连接池(JedisPool)
    • 使用:
      • 创建连接池对象
      • 调用方法getResource()获取连接
      • 示例:
//0.创建一个配置对象,这个可以抽取为一个工具类
JedisPoolConfig config = new JedisPoolConfig();
//设置池中最大连接数
config.setMaxTotal(50);
//设置池中最大空闲数
config.setIdle(10);
//.....还有很多的方法可以配置
JedisPool pool = new JedisPool();
Jedis jedis = pool.getResource();
jedis.set("username", "zhangsan");
jedis.close();

6. 案例

  • 需求:
    • 1.提供一个index.html页面,页面中有一个省份,下拉列表
    • 2.当页面加载完成之后,发送ajax请求,加载全部的省份信息
  • 注意:
    • 用redis来缓存一些不经常发生变化的数据,因为数据库中的数据一旦发生改变,那么redis中的数据也要发生改变
    • 在service对应的增删改方法中,将redis数据删除就可以了
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值