目录
本文主要根据尚硅谷b站视频学习,
安装
在虚拟机Linux中安装,下载,然后放到虚拟机的/opt路径下
解压,然后通过make指令编译和安装,在此之前,要安装好c语言环境和gcc,这里就不细说了
启动
前台启动“redis-server
后台启动
到/opt路径下,复制conf文件
进入/etc,修改redis.conf
这里改成yes,保存退出
在etc…目录下运行conf文件,完成后台运行
来验证一下:
关闭redis
或者用kill命令
介绍
默认16个数据库,下标0开始,使用select命令来切换数据库,所有库同样密码。
dbsize查看当前数据库的key
flushdb清空当前数据库
flushall通杀全部库
数据类型
key操作
先设定key
查看key,及查看key的类型
删除key
expire key 10:给key设置10s过期时间
ttl查看还有多少秒过期,-1表示永不过期,-2表示已经过期
查看当前数据库key数量
清空:flushdb
字符串(String)
set <key> <value>
get <key>
setnx <key> <value>只有key不存在时,设置key的值
incr <key>增加1
decr <key>减一
incrby/decrby / <步长>:增加/减少步长
mset、mget:设置多个key value值
获取范围getrange
setrange <key><起始位置><value>
用value覆写指定位置的字符串
setnx <key> <value>设置键的同时,设置过期时间
getset <key><value>设置了新值同时获得旧值
List
Redis列表是简单的字符串列表,按照插入顺序排序,底层为一个双向链表,对两端的操作性很高,通过索引下标的操作中间的节点性能会较差
lpush/rpush key1 value1 value2…:从左/右边插入一个值
lpop/rpop从左、右吐一个值
lrange key start stop按照索引下标从左往右获得元素
lindex key index 按照索引下标获得元素
llen key 获得列长度
lrem key n value:从左边删除n个value
iset key index value:将列表key下标为index的值替换成value
set集合
sadd key value1 value2添加
****加粗样式smembers key查询
sismemer key value判断集合key是否含有value值,有1,没有0
scard key返回该集合的元素个数
**srem key value1 value2…**删除集合某元素
spop key 随机从集合中吐一个值
srandmember key n:随机从该集合中取出n个值,不会从集合删除
smove key1 key2 value:将key1中的value值转给key2
sinter key1 key2返回交集元素
sunion key1 key2返回并集元素
sdiff key1 key2 返回两个集合的差集元素(key1中的,不包括k2中的)
Set集合数据结构是字典,字典是通过哈希表实现的
哈希(Hash)
hash是键值对集合,是string类型的field和value的映射表,hash特别适合用于存储对象,类似java里面的Map<String,Object>
hset key field value:设定值
hget key field:获取field的值
hmset key field1 value1 field2 value2 : 批量设置
hexists key field:判断field是否存在
hkeys key:列出所有field
hvals key:列出所有value
hincrby key field n:将field增加n
hsetnx key field value:将key中的域field的值设为value,当且仅当域field不存在
有序集合Zset
没有重复元素的字符串集合,有序集合的每个成员都关联了一个评分score,这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员,集合成员是唯一但评分可以重复
添加:zadd key score1 value1 score2 value2…
zrange key start stop:排名显示
zrangebyscore key min max [withscores] : 在此区间内元素从小到大排序
zrevrangebyscore key max min [withscores] : 在此区间从大到小排序
zincrby key increment value:给value增加increment分数
zcount key min max : 统计min到max间元素个数
zrank key value : 返回该值在集合中的排名,从0开始
zrem key value : 删除该集合,给定值的元素
发布和订阅
pub/sub是一种消息通信模式:发送者pub发送信息,sub订阅者接收信息
Redis可以订阅任意数量的频道
订阅者:
发布者:
订阅者收到发布者发布的haha:
其它数据类型
Bitmaps
Redis提供这个"数据类型"可以对位进行操作,实际是字符串
setbit key offset value设置键的第offset个位的值(从0算起)
getbit key offset 获取值
bitop and b1 b2 : 两个bitmap都共有值的数量
HyperLogLog
基数
添加:pfadd key value1 value2
pfcount key 统计数量
pfmerge key1 key2 合并数量
Geographic
经纬度设置
geoadd key 经度 纬度 value : 添加
geopos key value : 获取经纬度值
geodist key value1 value2 [单位]: 计算value1和value2的距离(单位默认为米)
指定坐标内,指定半径内的城市
如:指定110 30坐标内,1000km的城市
Jedis
登录maven,添加依赖:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
然后测试:
package com;
import redis.clients.jedis.Jedis;
public class JedisDemo1 {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.19.130",6379);
//测试
String value = jedis.ping();
System.out.println(value);
}
}
结果:
Jedis操作数据类型
操作key
查找数据库中所有的key
//操作key
@Test
public void demo1(){
Jedis jedis = new Jedis("192.168.19.130",6379);
Set<String> keys = jedis.keys("*");
keys.forEach(System.out::println);
}
结果:
//添加key
jedis.set("name","lucy");
//获取
String name = jedis.get("name");
//设置多个key-value
jedis.mset("k1","desk","k2","room","k3","bed");
List<String> kList = jedis.mget("k1","k2","k3");
操作list
@Test
public void demo2(){
Jedis jedis = new Jedis("192.168.19.130",6379);
jedis.lpush("key1","lucy","marry","john");
List<String> lList = jedis.lrange("key1",0,-1);
System.out.println(lList);
}
结果:
操作set
@Test
public void demo3(){
Jedis jedis = new Jedis("192.168.19.130",6379);
jedis.sadd("sname","lucy","jack","mike");
Set<String> s = jedis.smembers("sname");
System.out.println(s);
}
操作Hash
@Test
public void demo4(){
Jedis jedis = new Jedis("192.168.19.130",6379);
jedis.hset("users","age","20");
String age = jedis.hget("users","age");
}
操作z-set
@Test
public void demo5(){
Jedis jedis = new Jedis("192.168.19.130",6379);
jedis.zadd("z",200,"java");
jedis.zrange("z",0,-1);
}
springboot整合redis
除了springboot本身依赖外,还需要以下:
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--spring集成redis所需common-pool2-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.7.0</version>
</dependency>
在application.properties文件配置
# 应用名称
spring.application.name=test
spring.redis.host=192.168.19.130
spring.redis.port=6379
#redis数据库索引(默认为0)
spring.redis.database=0
#连接超时时间(毫秒)
spring.redis.timeout=1800000
#连接池最大数量(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active=20
#最大阻塞等待时间(负值表示没有限制)
spring.redis.lettuce.pool.max-wait=-1
#连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=5
#连接池最小空闲连接
spring.redis.lettuce.pool.min-idle=0
写个controller来test一下
package com.redis.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/redisTest")
public class RedisTestController {
@Autowired
private RedisTemplate redisTemplate;
@GetMapping
public String testRedis(){
redisTemplate.opsForValue().set("name","john");
return (String)redisTemplate.opsForValue().get("name");
}
}
运行下,如果出错,可以在Testapplication加上
@EnableAutoConfiguration(exclude={
DataSourceAutoConfiguration.class})
结果:
挺入门的,能实现就是一小步