【无标题】Redis安装以及基本命令

一 . 安装

1 . 基于tar。gz安装

下载地址:https://redis.io/download/
#安装gcc环境和make指令
apt-get install gcc
apt-get install make

#下载
wget http://download.redis.io/releases/redis-5.0.8.tar.gz

#解压
tar -zxvf redis-5.0.8.tar.gz -C /usr/local/

#make
cd /usr/local/redis-5.0.8
make

#运行
cd src
./redis-server
前台运行【./redis-server】
在这里插入图片描述
redis客户端测试【./redis-cli】
在这里插入图片描述

2.基于Docker安装

安装成功后,会自动在后台启动redis的服务端
1.准备工作
mkdir -p /opt/redis
cd /opt/redis
创建docker-compose.yml文件
version: ‘3.7’
services:
redis:
image: daocloud.io/library/redis:5.0.8
restart: always
container_name: redis
environment:
- TZ=Asia/Shanghai
ports:
- 6379:6379

 启动容器

docker-compose up -d
测试
在这里插入图片描述

二.Redis的客户端工具

1.命令行客户端

#默认情况下,连接的是本地的redis,且端口号是默认的6379
redis-cli

#完整语法
#redis-cli -h redis服务器的IP -p redis的端口
redis-cli -h 192.168.145.128 -p 6379

2.图形化客户端在这里插入图片描述在这里插入图片描述
3.java客户端

1.Jedis:Redis官方提供的一个Java操作Redis的API,Jedis的API就是Redis的命令
2.RedisTemplate:SpringBoot集成Redis提供的API

四、Redis的五种数据类型

1、五种数据类型
  • string:字符串
  • hash:对象
  • list:有序列表
  • set:无序集合
  • zset:有序集合
1.string相关命令

#设置值
#set key value
set name lucy
#结果,正确就返回OK

#设置key的同时设置过期日期,单位是秒
setex key second value

#设置key的同时设置过期日期,单位是毫秒
psetex key second value

#获取值
#get key
get name
#结果,有就返回值,没有nil[null]

#返回key对应的value,再重新设置这个key的值
#getset key value
getset name lily

#设置多个键值对
#mset k1 v1 k2 v2 …
mset sex 1 age 20 address hangzhou
#结果:OK

#获取多对key对应的value
#mget k1 k2 k3 …
mget sex age address
#结果:依次返回得到数据

#设置key-value:如果key不存在,则设置,如果key存在,则什么都不做
#setnx key value
#结果:成功返回1,失败返回0
setnx phone 13577889900

#计算key对应的value的长度
#strlen key
strlen phone
#结果为11,phone存的值是11位

#在原先的基础之上进行字符串追加
#append key value
append address xiaoshan
#本来address的值是hangzhou,现在就是hangzhouxiaoshan

#自增1,value是数值类型才能成功。如果key不存在,则直接以0为基础,进行自增。如果这个值不是数值,则会报错
#incr key
incr age
#age本来是20,现在返回就是21

#自增指定数量,value是数值类型才能成功
incrby age 5
#age本来是20,现在返回就是25

#自减1,value是数值类型才能成功。
#decr key
decr age
#age本来是0,现在返回就是-1

#自减指定数量,value是数值类型才能成功
#decrby key
decrby age 20
#age本来是30,现在返回就是10

2.hash相关命令

#设置值,必须指定大key和小key
hset person name lisi

#设置多值
hmset person sex 1 age 20

#获取单个小key对应的value
hget person sex

#获取多个小key对应的value们
hmget person name age

#获取所有的小key
hkeys person

#获取所有的小key对应的values
hvals person

#获取所有大key中的键值对
hgetall person

#删除小key
hdel 大key 小key

#判断小key是否存在
hexists person age

#求大key中小key的数量
hlen person

#设置小key【小key不存在,则设置成功,如果存在,则什么都不做】
hsetnx person age 25

3.list相关命令

在操作list时

  • 向list中增加数据【有两种方式,推荐使用右压栈】
    • 左边增加数据【左压栈,后增加的数据会把之前增加的数据向右挤】,在读取时是反向的
    • 右边增加数据【右压栈,后增加的数据会把之前增加的数据向左挤】,在读取时是正向的
  • 从list中获取数据
    • 获取的数据是从左到右的

#左压栈
lpush key v1 v2 …
#特征:存入的数据顺序跟读取顺序相反

#右压栈
rpush key v1 v2 …
#特征:存入的数据顺序跟读取顺序相同

#查询列表中的数据
#下标从0开始,如果要读到最末尾,endIndex就是-1
#lrange key startIndex endIndex
lrange key 0 -1

#获取列表元素的个数
llen key

#获取指定索引的元素,index表示索引
lindex key index
#获取指定索引为3的元素
#lindex key 3

#从左边弹出一个元素[获取最左边的元素,再删除它]
lpop key

#从右边弹出一个元素
rpop key

#从一个列表的右边弹出元素,再追到加另一个列表的左边
rpoplpush 源列表 目标列表

#移除count个的value值
lrem key count value
lrem names 2 tom
#删除names列表中2个tom【是从左开始移除】

#根据索引设置元素的值
LSET key index value

#截取集合中保留下来的新元素【保留从start开始,到stop结束的元素,包含头尾】 [start, stop]
LTRIM key start stop

4.set相关命令

#存值
sadd myset aa bb cc
#返回存入的个数

#获取集合长度
scard myset

#获取集合元素
smembers myset

#判断元素是否在集合中。存在:返回1,不存在:返回0
sismember myset cc

#随机弹出一个元素
spop myset

#随机弹出指定个数元素
spop myset 2

#差集
sdiff myset1 myset2

#交集
sinter myset1 myset2

#并集
sunion myset1 myset2

#将交集结果存入到另一个集合中
#sdiffstore 存储结果的集合名 操作的集合一 操作的集合二
sdiffstore myset3 myset1 myset2

#将交集结果存入到另一个集合中
sinterstore myset4 myset1 myset2

#将并集结果存入到另一个集合中
sunionstore myset5 myset1 myset2

#将myset1中的aa元素移动到myset3
smove myset1 myset3 aa

#删除myset1中的a和b元素
SREM myset1 a b

5.zset相关命令【sorted set】

#向有序集合中增加元素
#zadd 集合名 分数1 名称1 分数2 名称2 …
zadd tuhaobang 10 liubei 80 caocao 30 sunquan
#返回插入的数量

#获取集合中元素的数量
zcard tuhaobang

#获取集合中指定区间的元素名称,如果后面的索引是-1,则返回所有元素名称
zrange tuhaobang 0 -1

  1. “liubei”
  2. “sunquan”
  3. “caocao”

#获取集合所有的元素,包括名称和分数【是从小到大排序】
zrange tuhaobang 0 -1 withscores

  1. “liubei”
  2. “10”
  3. “sunquan”
  4. “30”
  5. “caocao”
  6. “80”

#获取集合前两位元素的名称和分数
zrange tuhaobang 0 1 withscores

  1. “liubei”
  2. “10”
  3. “sunquan”
  4. “30”

#为集合中指定的名称的元素增加分数
zincrby tuhaobang 50 liubei
#返回增加后的分数

#返回集合中指定名称的分数
zscore tuhaobang sunquan

#把myzset1和myzset2根据元素名称求出交集,并把相同名称的value加在一起,得到元素名称的新分数,存入到新集合中,成功返回的是交集的个数
#zinterstore 目标集合 操作集合的数量 集合一 集合二 …
ZINTERSTORE myzset3 2 myzset1 myzset2

#zrangebyscore 集合名称 小分数 大分数 [withscores] [limit 第几条开始显示 显示数量]
#在不知道当前集合中最大值和最小值的情况下,-inf代表最小值 +inf代表最大值
#获取tuhaobang集合中所有元素名称及分数
zrangebyscore tuhaobang -inf +inf withscores
#获取tuhaobang集合中第一个元素名称及分数
zrangebyscore tuhaobang -inf +inf withscores limit 0 1
#获取tuhaobang集合中分数在50-100之间的所有元素名称及分数
zrangebyscore tuhaobang 50 100 withscores
#获取tuhaobang集合中分数在50-100之间的前两位元素名称及分数
zrangebyscore tuhaobang 50 100 withscores limit 0 2

#按从大到小的顺序进行排序,并获取前2位
zrevrangebyscore tuhaobang +inf -inf withscores limit 0 2

#根据元素名删除元素
zrem key member [member…]

#获取集合中指定元素名称对应的索引
zrank tuhaobang caocao

#删除指定分数区间的元素[10,20],删除成功返回删除的个数,否则返回0
ZREMRANGEBYSCORE tuhaobang 10 20

#返回指定区间分数的元素数量
ZCOUNT key min max

6.通用命令
.key相关的

#查找匹配规则的key, :代表0到多个字符,?代表一个字符
keys *
keys ?a

#判断key是否存在,存在:返回1,不存在:返回0
exists key

#删除key,删除成功返回1,删除不存在的key返回0
del key

#设置已经存在的key的过期时间,单位为秒
expire key seconds

#查看key剩余有效时间
#ttl key
ttl gender
#结果:返回剩余有效时间,如果已经过期:返回-2,如果没有设置有效时间:返回-1

#移除指定key的生存时间,永久的持久化
persist key

#为已经存在的key设置过期时间,单位是毫秒
pexpire key 毫秒

#查看指定key的剩余存活时间,单位是毫秒
pttl key

#获取指定的key的value的数据类型
type key

#移动当前数据库中对应的key到其他数据库,dbindex是0-15
move key dbindex

.跟数据库相关的

#redis默认有16个数据库,分别是 db0 - db15
#查看当前数据库下有多少key
dbsize

#切换数据库,dbindex是0-15
select dbindex

#清空当前数据库,慎重
flushdb

#清空所有数据库中的数据,慎重
flushall

#实时监控Redis服务接收到的命令【其他客户端的操作,能够被监控到】
monitor

7.查看redis性能的命令

#redis写的性能
redis-benchmark set

#redis读的性能
redis-benchmark get

五.Jedis

1.概述
  • 是Redis官方提供一款Java操作Redis的API
  • Jedis方法就是Redis的命令
2.快速入门

1.导入依赖

redis.clients
jedis
2.9.0


junit
junit
4.12


org.projectlombok
lombok
1.18.12
provided

字节存储需要导入spring-context的依赖

org.springframework
spring-context
5.1.5.RELEASE

2.代码测试
@Test
public void quickTest() throws Exception {
// 参数一:redis服务器ip
// 参数二:redis服务器的端口号
Jedis jedis = new Jedis(“192.168.145.140”, 6379);
//设置密码
jedis.auth(“ghyredis”);
String result = jedis.set(“name”, “xiaoming”);
System.out.println("result = " + result);
String value = jedis.get(“name”);
System.out.println("value = " + value);
}

3.JedisPool的使用

/**

  • 使用连接池
    **/
    @Test
    public void jedisPoolTest() throws Exception {
    GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
    String host = “192.168.145.140”;
    int port = 6379;
    int timeout = 3000;
    String password = “ghyredis”;
    //public JedisPool(final GenericObjectPoolConfig poolConfig, final String host, int port, int timeout, final String password)
    //连接池对象
    JedisPool jedisPool = new JedisPool(poolConfig, host, port, timeout, password);
    Jedis jedis = jedisPool.getResource();
    jedis.hset(“person_1001”, “id”, “1001”);
    jedis.hset(“person_1001”, “name”, “李四”);

    Map<String, String> map = jedis.hgetAll(“person_1001”);
    System.out.println(map);
    //归还连接到连接池
    jedis.close();
    }

4.JedisPool工具类封装

public class JedisPoolUtils {

private static JedisPool jedisPool = null;

private static final String HOST = "192.168.145.140";
private static final int PORT = 6379;
private static final int TIMEOUT = 3000;
private static final String PASSWORD = "ghyredis";

static {
    GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
    jedisPool = new JedisPool(poolConfig, HOST, PORT, TIMEOUT, PASSWORD);
}

public static Jedis getResource(){
    return jedisPool.getResource();
}

}

六.SpringBoot整合Redis

1.导入依赖
org.springframework.boot spring-boot-starter-data-redis ##### 2.配置文件 spring: redis: host: 容器端口号 port: 6379 password: 密码 database: 进行操作的数据库 jedis: pool: max-active: 10 max-wait: 3000 min-idle: 5 max-idle: 10
3.测试代码

@SpringBootTest
class SpringbootRedisDemo01ApplicationTests {

@Autowired
RedisTemplate redisTemplate;

/**
 * 操作string
 *  使用RedisTemplate来操作字符串时,在存储数据时会对key和value进行序列化操作。
 *      序列化操作会对选择对应的序列化器来操作,如果没有指定序列化器,那么默认选择是JDK序列化器
 *
 *  RedisTemplate
 **/
@Test
public void stringTest() throws Exception {
    //setIfAbsent 就是 setnx
    Boolean flag = redisTemplate.opsForValue().setIfAbsent("name", "xiaowang", 5 * 60, TimeUnit.SECONDS);
    System.out.println("flag = " + flag);
    String name = (String) redisTemplate.opsForValue().get("name");
    System.out.println("name = " + name);

    redisTemplate.opsForValue().set("gender", 1);

}

}

4.序列化器
  1. 默认情况下
    RedisTemplate 继承RedisAccessor类,而该类实现了InitializingBean接口,所以RedisTemplate会调用afterPropertiesSet`方法。在该方法中会对操作key和value进行序列化操作,如果指定了具体的序列化器,那么就会使用指定的序列化器,如果没有指定,则使用JDK序列化器
    public void afterPropertiesSet() {
    super.afterPropertiesSet();
    boolean defaultUsed = false;
    if (this.defaultSerializer == null) {
    this.defaultSerializer = new JdkSerializationRedisSerializer(this.classLoader != null ? this.classLoader : this.getClass().getClassLoader());
    }

     if (this.enableDefaultSerializer) {
         if (this.keySerializer == null) {
             this.keySerializer = this.defaultSerializer;
             defaultUsed = true;
         }
    
         if (this.valueSerializer == null) {
             this.valueSerializer = this.defaultSerializer;
             defaultUsed = true;
         }
    
         if (this.hashKeySerializer == null) {
             this.hashKeySerializer = this.defaultSerializer;
             defaultUsed = true;
         }
    
         if (this.hashValueSerializer == null) {
             this.hashValueSerializer = this.defaultSerializer;
             defaultUsed = true;
         }
     }
    
     if (this.enableDefaultSerializer && defaultUsed) {
         Assert.notNull(this.defaultSerializer, "default serializer null and not all serializers initialized");
     }
    
     if (this.scriptExecutor == null) {
         this.scriptExecutor = new DefaultScriptExecutor(this);
     }
    
     this.initialized = true;
    

    }

2.指定使用序列化器
@Configuration
public class MyRedisConfig {

@Bean("myRedisTemplate")
public RedisTemplate myRedisTemplate(RedisConnectionFactory connectionFactory){
    RedisTemplate myRedisTemplate = new RedisTemplate();
    //设置连接工厂
    myRedisTemplate.setConnectionFactory(connectionFactory);

    //更换key和value的序列化器
    myRedisTemplate.setKeySerializer(new StringRedisSerializer());
    myRedisTemplate.setValueSerializer(new StringRedisSerializer());
    return myRedisTemplate;
}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值