Redis入门

目录

Redis入门

数据类型

常用命令

在Java中操作Redis


Redis入门

Redis简介

Redis is an open source (BSD licensed), in-memory data structure store, 
used as a database, cache, andmessage broker,
翻译为:Redis是一个开源的内存中的数据结构存储系统,
它可以用作:数据库、缓存和消息中间件
官网: https://redis.io
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,
官方提供的数据是可以达到100000+的OPS(每秒内查询次数)。它存储的value类型比较丰富,
也被称为结构化的NoSql数据库。Nosql(Not OnlySOL),不仅仅是SQL,泛指非关系型数据库。
NoSql数据库并不是要取代关系型数据库,而是关系型数据库的补充。

关系型数据库(RDBMS)
    Mysql
    Oracle
    DB2
    SQLServer
非关系型数据库(Nosql)
    Redis
    Mongo db
    MemCached

Redis 应用场景
    缓存、任务队列、消息队列、分布式锁

Redis下载与安装

Redis安装包分为windows版和Linux版:
windows版下载地址: https://github.com/microsoftarchive/redis/releases
Linux版下载地址: https://download.redis.io/releases/

Redis入门_第1张图片

在Linux系统安装Redis步聚
1将Redis安装包上传到Linux
2.解压安装包,命令: tar -zxvf redis-4.0.0.tar.gz -C /usr/local
3.安装Redis的依赖环境gcc,命令: yum install gcc-c++
4.进入/usr/local/redis-4.0.0,进行编译,命令: make
5.进入redis的src目录,进行安装,命令:make install

Redis服务启动与停止

Linux中redis服务启动,可以使用redis-server,默认端口号为6379

Windows系统中启动Redis,直接双击redis-server.exe即可启动Redis服务,redis服务默认端口号为6379

Ctrl+c停止Redis服务

设置Redis密码

vim redis.conf  //修改Redis配置文件
将# requirepass foobared
修改为 :requirepass 需要设置的密码

 Redis入门_第2张图片

重新启动Redis
src/redis-server ./redis.conf
启动客户端
src/redis-cli -h localhost -p 6379
进行登录验证
 keys *
出现: NOAUTH Authentication required.
输入:auth 123456
登录成功

另一种登录方式:
退出客户端:exit
src/redis-cli -h localhost -p 6379 -a 123456
成功登录

实现远程连接

修改redis.conf文件,将bind 127.0.0.1注释掉
关闭redis服务
    查找服务进程  ps -ef | grep redis
    关闭进程     kill -9 39681
重新启动redis服务
 src/redis-server ./redis.conf

防火墙操作
firewall-cmd --zone=public --add-port=6379/tcp --permanent //开放6379端口
firewall-cmd --reload    //立即生效
firewall-cmd --zone=public --list-ports    //查看开放的端口

shift + 右键 打开powershell命令窗口
输入: .\redis-cli.exe -h 192.168.147.100 -p 6379 -a 123456

 Redis入门_第3张图片

数据类型

介绍

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型
字符串 string
哈希 hash
列表list
集合set
有序集合 sorted set

Redis 5种常用数据类型

Redis入门_第4张图片

常用命令

字符串 string 操作命令

SET key value            设置指定key的值
GET key                  获取指定key的值
SETEX key seconds value  设置指定key的值,并将 key 的过期时间设为 seconds 秒
SETNX key value          只有在key不存在时设置key的值
更多命令可以参考Redis中文网: https://www.redis.net.cn

Redis入门_第5张图片Redis入门_第6张图片
哈希 hash 操作命令

Redis hash是一个string类型的 field 和 value 的映射表,特别适合用于存储对象,常用命令:
HSET key field value  将哈希表 key 中的字段 field 的值设为 value
HGET key field        获取存储在哈希表中指定字段的值
HDEL key field        删除存储在哈希表中的指定字段
HKEYS key             获取哈希表中所有字段
HVALS key             获取哈希表中所有值
HGETALL key           获取在哈希表中指定 key 的所有字段和值

Redis入门_第7张图片Redis入门_第8张图片
列表list 操作命令

Redis 列表是简单的字符串列表,按照插入顺序排序,常用命令:
LPUSH key value1[value2      将一个或多个值插入到列表头部
LRANGE key start stop        获取列表指定范围内的元素
RPOP key                     移除并获取列表最后一个元素
LLEN key                     获取列表长度
BRPOP key1 [key2 ]timeout    移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止

Redis入门_第9张图片Redis入门_第10张图片
集合 set 操作命令

Redis set是string类型的无序集合。
集合成员是唯一的,这就意味着集合中不能出现重复的数据,常用命令:
SADD key member1 [member2]    向集合添加一个或多个成员
SMEMBERS key                  返回集合中的所有成员
SCARD key                     获取集合的成员数
SINTER key1 [key2]            返回给定所有集合的交集
SUNION key1[key2]             返回所有给定集合的并集
SDIFF key1 [key2]             返回给定所有集合的差集
SREM key member1 [member2]    移除集合中一个或多个成员

Redis入门_第11张图片Redis入门_第12张图片
有序集合 sorted set 操作命令

Redis sorted set 有序集合是 string 类型元素的集合,且不允许重复的成员。
每个元素都会关联一个double类型的分数(score)。
redis正是通过分数来为集合中的成员进行从小到大排序。
有序集合的成员是唯一的,但分数却可以重复。常用命令:
ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
ZINCRBY keyincrement member 有序集合中对指定成员的分数加上增量increment
ZREM key member [member ...] 移除有序集合中的一个或多个成员

Redis入门_第13张图片

Redis入门_第14张图片Redis入门_第15张图片
通用命令

KEYS pattern    查找所有符合给定模式(pattern)的 key
EXISTs key      检查给定key是否存在
TYPE key        返回 key所储存的值的类型
TTL key         返回给定 key 的剩余生存时间(TTL, time to live),以秒为单位
DEL key         该命令用于在 key 存在是删除 key

Redis入门_第16张图片 Redis入门_第17张图片

在Java中操作Redis

介绍

Redis的Java 客户端很多,官方推荐的有三种:
    Jedis
    Lettuce
    Redisson
Spring对 Redis 客户端进行了整合,提供了Spring Data Redis,
在Spring Boot项目中还提供了对应的Starter,即spring-boot-starter-data-redis

Jedis

创建maven工程
导入坐标
编写测试类
使用Jedis操作Redis的步骤:
    1、获取连接 2、执行操作 3、关闭连接
注意事项:运行单元测试类要先将Redis服务启动

 Redis入门_第18张图片

    
        
            junit
            junit
            4.12
        

        
            redis.clients
            jedis
            2.8.0
        
    
/**
 * 使用Jedis操作Redis
 */
public class JedisTest {

    @Test
    public void redisTest() {
        //1、获取连接
        Jedis jedis = new Jedis("localhost", 6379);

        //2、执行具体的操作
        jedis.set("username","xiaoming"); //调用方法

        //3、关闭连接
        jedis.close();
    }
}
Redis客户端在测试类未运行前查询为空
运行 redisTest 单元测试后查询出在Java中写入的值

 Redis入门_第19张图片

/**
 * 使用Jedis操作Redis
 */
public class JedisTest {

    @Test
    public void redisTest() {
        //1、获取连接
        Jedis jedis = new Jedis("localhost", 6379);

        //2、执行具体的操作
        jedis.set("username", "xiaoming");

        String value = jedis.get("username");
        System.out.println(value);

        //jedis.del("username");

        jedis.hset("myhash", "addr", "guangdong");

        String hValue = jedis.hget("myhash", "addr");
        System.out.println(hValue);

        Set keys = jedis.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }

        //3、关闭连接
        jedis.close();
    }
}

Spring Data Redis

在Spring Boot 项目中,可以使用Spring Data Redis来简化Redis操作,maven坐标:

    org.springframework.boot
    spring-boot-starter-data-redis
Spring Data Redis中提供了一个高度封装的类: RedisTemplate,
针对edis客户端中大量api进行了归类封装,将同-类型操作封装为operation接口,
具体分类如下:
    ValueOperations:简单K-V操作
    SetOperations: set类型数据操作
    ZSetOperations: zset类型数据操作
    HashOperations: 针对map类型的数据操作
    ListOperations:针对list类型的数据操作
创建SpringBoot工程
导入maven坐标
编写测试类
#application.yml配置文件
spring:
  application:
    name: springdataredis_demo
  #redis相关配置
  redis:
    host: localhost
    port: 6379
    #password: 123456
    database: 0   #redis 启动提供了16个数据库  默认使用0号数据库
    jedis:
      pool:
        max-active: 8  #最大连接数
        max-wait: 1ms  #连接池最大阻塞等待时间
        max-idle: 4   #连接池中的最大空闲连接
        min-idle: 0   #连接池中的最小空闲连接
//测试类
@SpringBootTest
@RunWith(SpringRunner.class)
class SpringBootDataRedisTests {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testString(){
        redisTemplate.opsForValue().set("city","guangzhou");
    }
}
运行testString()测试类,在Redis客户端查看key,发现存储的是序列化后的数据,
可以通过配置类设置序列化方式

Redis入门_第20张图片

/**
 * Redis配置类
 */
@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){

        RedisTemplate redisTemplate = new RedisTemplate<>();

        //默认的key序列化器为:JdkSerializationRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        redisTemplate.setConnectionFactory(redisConnectionFactory);

        return redisTemplate;

    }
}
注意:Redis配置类只修改了key的序列化方式,以便在Redis客户端查看操作,
对应的Value还是默认的序列化方式

 Redis入门_第21张图片

@SpringBootTest
@RunWith(SpringRunner.class)
class SpringBootDataRedisTests {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 操作String类型数据
     */
    @Test
    public void testString() {
        redisTemplate.opsForValue().set("city123", "guangzhou");
        String value = (String) redisTemplate.opsForValue().get("city123");
        System.out.println(value);

        redisTemplate.opsForValue().set("key1", "value", 10l, TimeUnit.SECONDS);

        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city123", "beijing");
        System.out.println(aBoolean);

    }

    /**
     * 操作hash类型数据
     */
    @Test
    public void testHash() {
        HashOperations hashOperations = redisTemplate.opsForHash();

        //存值
        hashOperations.put("001", "name", "xiaoming");
        hashOperations.put("001", "age", "20");
        hashOperations.put("001", "address", "beijing");

        //取值
        String age = (String) hashOperations.get("001", "age");
        System.out.println(age);

        //获取hash结构中的所有字段
        Set keys = hashOperations.keys("001");
        for (Object key : keys) {
            System.out.println(key);
        }

        //获取hash结构中的所有值
        List values = hashOperations.values("001");
        for (Object value : values) {
            System.out.println(value);
        }
    }

    /**
     * 操作list类型的数据
     */
    @Test
    public void testList() {
        ListOperations listOperations = redisTemplate.opsForList();

        //存值
        listOperations.leftPush("mylist", "a"); //存一个值
        listOperations.leftPushAll("mylist", "b", "c"); //存多个值

        //取值
        List mylist = listOperations.range("mylist", 0, -1);

        for (String value : mylist) {
            System.out.println(value);
        }

        //获取列表长度
        Long size = listOperations.size("mylist");
        int lSize = size.intValue();
        for (int i = 0; i < lSize; i++) {
            //出队列
            String rightPop = (String) listOperations.rightPop("mylist");
            System.out.println(rightPop);
        }
    }

    /**
     * 操作set类型数据
     */
    @Test
    public void testSet() {

        SetOperations setOperations = redisTemplate.opsForSet();
        //存值
        setOperations.add("myset", "a", "b", "c", "a");

        //取值
        Set myset = setOperations.members("myset");
        for (String s : myset) {
            System.out.println(s);
        }

        //删除成员
        setOperations.remove("myset", "a", "b");

        myset = setOperations.members("myset");
        for (String s : myset) {
            System.out.println(s);
        }
    }

    /**
     * 操作ZSet类型数据
     */
    @Test
    public void testZSet() {
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

        //存值
        zSetOperations.add("myZSet", "a", 10.0);
        zSetOperations.add("myZSet", "b", 11.0);
        zSetOperations.add("myZSet", "c", 12.0);
        zSetOperations.add("myZSet", "a", 13.0);

        //取值
        Set myZSet = zSetOperations.range("myZSet", 0, -1);
        for (String s : myZSet) {
            System.out.println(s);
        }

        //修改分数
        zSetOperations.incrementScore("myZSet", "b", 20.0);
        //取值 看一下排序有没有变化
        myZSet = zSetOperations.range("myZSet", 0, -1);
        for (String s : myZSet) {
            System.out.println(s);
        }

        //删除成员
        zSetOperations.remove("myZSet", "a", "b");
        //取值
        myZSet = zSetOperations.range("myZSet", 0, -1);
        for (String s : myZSet) {
            System.out.println(s);
        }
    }

    /**
     * 通用操作,针对不同的数据类型都可以操作
     */
    @Test
    public void testCommon() {
        //获取Redis中的所有key
        Set keys = redisTemplate.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }

        //判断某个key是否存在
        Boolean test = redisTemplate.hasKey("test");
        System.out.println(test);

        //删除指定key
        redisTemplate.delete("myZSet");

        //获取指定key对应的value的数据类型
        DataType dataType = redisTemplate.type("myset");
        System.out.println(dataType.name());
    }
}

你可能感兴趣的:(从0-1的后端学习,redis,缓存,java)