文章目录
- Redis
-
- 1.Redis简介
- 2.下载安装
- 3.命令操作
-
- 3.1数据结构
- 3.2常用命令(可以去中文网的redis教程去看)
- 4.持久化操作
- 5.使用Java客户端操作redis
- 6. 案例
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持久化的机制:
5.使用Java客户端操作redis
Jedis jedis = new Jedis("localhost", 6379);
jedis.set("username", "zhangsan");
jedis.close();
Jedis jedis = new Jedis();
jedis.set("username", "zhangsan");
String value = jedis.get("username");
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");
Map<String, String> user = jedis.hgetAll("user");
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");
- 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()获取连接
- 示例:
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数据删除就可以了