学习笔记--Redis

Redis

NoSQL概述

什么是NoSQL

  • NoSQL = Not Only SQL
  • 非关系型的数据库

为什么需要NoSQL

  • High performance 高并发读写
  • Huge Storage 海量数据的高效率存储和访问
  • High Scalability && High Availability 高可扩展性和高可用性

NoSQL数据库的四大分类

  • 键值存储
  • 列存储
  • 文档存储
  • 图形存储

NoSQL特点

  • 易扩展
  • 灵活的数据模型
  • 大数据量,高性能
  • 高可用

Redis概述

高性能键值对数据库,支持的键值数据类型

  • 字符串类型
  • 散列类型
  • 列表类型
  • 集合类型
  • 有序集合类型

Redis应用场景

  • 缓存
  • 任务队列
  • 应用排行榜
  • 网站访问统计
  • 数据过期处理
  • 分布式集群架构中的session分离

Redis安装

linux下安装redis

  • 安装gcc-c++
  • make
  • make PREFIX=/home/programs/redis install
  • 复制redis.conf
  • 修改redis.conf
  • 启动./bin/redis-server ./redis.conf
  • 关闭 ./bin/redis-cli shutdown

Jedis

简单示例

依赖

        <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.7.0</version>
        </dependency>

示例

/**
* Jedis的测试
* Created by qy_lu on 2018/1/7.
*/
public class JedisTest1 {

    private static final String HOST = "192.168.31.100";
    private static final int PORT = 6379;

    /**
    * 单实例的测试
    */
    @Test
    public void test1() {
        // 1.设置IP地址和端口
        Jedis jedis = new Jedis(HOST, PORT);
        // 2.保存数据
        jedis.set("name", "imooc");
        // 3.获取数据
        String value = jedis.get("name");
        System.out.println(value);
        // 4.释放资源
        jedis.close();
    }

    @Test
    /**
    * 使用连接池
    */
    public void test2() {
        // 获得连接池的配置对象
        JedisPoolConfig config = new JedisPoolConfig();
        // 设置最大连接数
        config.setMaxTotal(30);
        // 设置最大空闲连接数
        config.setMaxIdle(10);

        // 获得连接池
        JedisPool jedisPool = new JedisPool(config, HOST, PORT);
        // 获得核心对象
        Jedis jedis = null;
        try {
            // 通过连接池获得连接
            jedis = jedisPool.getResource();
            // 设置数据
            jedis.set("name", "zhangsan");
            // 获取数据
            String value = jedis.get("name");
            System.out.println(value);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放资源

            if (jedis != null) {
                jedis.close();
            }
            if (jedisPool != null) {
                jedisPool.close();
            }
        }
    }
}

Redis的数据结构

key

  • 不要太长
  • 不要太短
  • 统一的命名规范

存储String

赋值

set company imooc
get company
getset company baidu   //取company的值并将company的值设为baidu
del company
incr person   //将person递增1,空为0再递增
decr person  //将person递减1
incrby num 5  //将num加5
decrby num 5   //将num减5
append num 5  //在num末尾追加字符5

存储Hash

hset myhash username jack
hset myhash age 18
hmset myhash2 username rose age 21
hget myhash username
hmget myhash username age
hgetall myhash
hdel myhash username
del myhash
hincrby myhash age 5  //myhash中的age的值增加5
hexists myhash username  //myhash中是否存在username
hlen myhash  //获取myhash中key的数量
hkeys myhash  //获取myhash中所有的key
hvals myhash  //获取myhash中所有的val

存储list

lpush mylist a b c        //从左边压入元素
rpush mylist2 a b c    //从右边压入元素
lrange mylist 0 5       //列出索引位置在0(start)和5(end)之间的元素
lrange mylist 0 -1     //也可以用-1表示从末端算起第几位
lpop mylist     //从左边弹出一个元素
rpop mylist   //从右边弹出一个元素
llen mylist   //获取列表的元素数量
lpushx mylist x    //将元素插入到列表的头部,若mylist不存在则不插入
lrem mylist 2 3     //从前往后删除2个3
lrem mylist -2 3     //从后往前删除2个3
lrem mylist 0 3     //删除列表里所有的3
lset mylist 3 x   //将索引为3的位置的值设置为x
linsert mylist before b 11   //在第一个b之前插入11
linsert mylist after b 22  //在第一个b之后插入22
rpoplpush mylist1 mylist2   //将mylist1的最右边元素弹出并压入mylist2的最左边

存储set

sadd myset a b c  //增加
srem myset a b  //删除
smembers myset   //查看所有
sismember myset a   //a是否存在myset中
sdiff mya1 myb1    //mya1和myb1的差集,mya1中有的,myb1中没有的元素
sinter mya1 myb1  //求交集
sunion mya1 myb1  //求并集
scard myset   //集合中元素数量
srandmember myset  //随机返回一个元素
sdiffstore  my1 mya1 myb1   //将mya1和myb1的差集存到my1
sinterstore my1 mya1 myb1   //将mya1和myb1的交集存到my1
sunionstore my1 mya1 myb1   //将mya1和myb1的并集存到my1

存储Sorted-set

zadd mysort 70 zs 80 ls 90 ww    //增加给定评分的值
zadd mysort 100 zs   //新的评分会覆盖旧的
zscore mysort zs   //获得zs的分数
zrem mysort ls ww    //删除元素
zcard mysort   //元素数量
zrange mysort 0 -1     //列出元素
zrange mysort 0 -1 withscores   //列出元素并带分数
zrevrange mysort 0 -1 withscores    //按分数从大到小列出元素
zremrangebyrank mysort 0 4  //删除范围内的元素
zremrangebyscore mysort 80 100   //按分数范围删除元素
zrangebyscore mysort 0 100  //列出分数范围内的元素
zrangebyscore mysort 0 100 withscores    //列出分数范围内的元素并带分数
zrangebyscore mysort 0 100 withscores limit 0 2     //列出分数范围内的前n个元素并带分数
zincrby mysort 3 ls   //给ls的分数增加3
zcount mysort 80 100   //分数范围内的元素数量

keys通用操作

keys *
keys my?
del my1 my2 my3
exists my1
exists mya1
rename key1 key2
expire key1 1000   //设置过期时间
ttl key1  //剩余时间
type key1  //key1的类型

Redis特性

多数据库

0 - 15数据库实例

select 0  //使用0号数据库
select 1
move myset 1   //将myset移动到1号数据库

事务

multi    //开启事务
exec     //命令被原子化执行
discard     //回滚

Redis持久化

  • RDB持久化
  • AOF持久化
  • 无持久化
  • 同时使用RDB和AOF持久化

    RDB持久化

    默认使用RDB

    将内存快照定时写到硬盘

    只有一个文件

    redis.conf配置

    AOF持久化

    记录操作日志

    redis.conf配置

Spring Data Redis

Maven配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.qyluo.redis</groupId>
    <artifactId>redis-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>redis-demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

原文地址:https://www.cnblogs.com/kioluo/p/8824756.html

时间: 2024-10-15 20:59:26

学习笔记--Redis的相关文章

redis学习笔记——Redis过期键的删除策略

Redis过期键的删除策略 对于过期键一般有三种删除策略 定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作: 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键:如果没有过期,那就返回该键: 定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键.至于删除多少过期键,以及要检查多少个数据库,则由算法决定. 下面我们来看看三种策略的优缺比较: 定时删除策略对内存是

学习笔记-Redis设计与实现-整数集合

整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素不多时,Redis就会使用整数集合作为集合键的底层实现. 6.1 整数集合的实现 contents数组时整数集合的底层实现:整数集合的每个元素都是contents数组的一个数组项(item),各个项在数组中按值的大小从小到大有序地排列, 并且数组中不包含任何重复项. length属性记录了整数集合包含地元素数量,也即是contents数组的长度. contents数组的真正类型取决于encoding属性

学习笔记-Redis设计与实现-数据库

9.1 服务器中得数据库 Redis服务器默认会创建16个数据库. 9.2 切换数据库 默认情况下,Redis客户端得目标数据库为0号数据库,但客户端可以通过执行SELECT命令来切换目标数据库. 9.3 数据库键空间 键空间和用户所见得数据库是直接对应得: 键空间得键就是数据库得键,每个键都是一个字符串对象. 键空间得值也就是数据库的值,每个值可以是字符串对象.列表对象.哈希表对象.集合对象和有序集合对象中的任意一种Redis对象. 9.3.1 添加新键 添加一个新键值对到数据库,实际上就是将

学习笔记-Redis设计与实现-对象

8.1 对象的类型与编码 8.1.1 类型 8.1.2 编码和底层实现 8.2字符串对象 字符串对象的编码可以是int.raw或者embstr. 如果字符串对象保存的是一个字符串值,并且这个字符串值的长度大于32字节(存疑,我电脑上是39字节),那么字符串对象将使用一个简单动态字符串(SDS)来保存这个字符串值,并将对象的编码设置为raw. 如果字符串对象保存的是一个字符串值,并且这个字符串值的长度小于等于32字节,那么字符串对象将使用embstr编码的方式来保存这个字符串值. embstr编码

学习笔记-Redis设计与实现-跳跃表

跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的. 跳跃表支持平均O(logN).最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点. Redis使用跳跃表作为有序结合键的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员(member)是比较长的字符串时,Redis就会使用跳跃表来作为有序集合见的底层实现. 5.1 跳跃表的实现 zskiplist结构,包含以下属性: header:

学习笔记-Redis设计与实现-链表

链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过删除节点来灵活地调整链表地长度. 当一个列表键包含了数量比较多地元素,又或者列表中包含的元素都是比较长的字符串时,Redis就会使用链表作为列表键的底层实现. 出了链表键之外,发布与订阅.慢查询.监视器等功能也用到了链表,Redis服务器本身还使用链表来保存多个客户端的状态信息,以及使用链表来构建客户端输出缓冲区(Output buffer) 3.1 链表和链表节点的实现 Redis的链表实现的特性总结如下: 双端:链表节点带有

学习笔记-Redis设计与实现-事件

Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件: 文件事件(file event):Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象. 时间事件(time event):Redis服务器中的一些操作(比如serverCron函数)需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象. 12.1 文件事件 Redis基于Reactor模式开发了自己的网络事件处理器,被称为文件事件处理器(file event

学习笔记-Redis设计与实现-RDB持久化

10.1 RDB文件的创建和载入 SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求. BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程继续处理命令请求. RDB文件的载入工作是在服务器启动时自动执行的,Redis并没有专门用于载入RDB文件的命令,只要Redis服务器在启动时检测到RDB文件存在,就会自动载入RDB文件. 因为AOF文件的更新频率通常比RDB文件的更新频率高,所以: 如果服务器开启了

学习笔记-Redis设计与实现-压缩列表

压缩列表(ziplist)是列表键和哈希键的底层实现之一. 7.1 压缩列表的构成 压缩列表是Redis为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构.一个压缩列表可以包含任意多个节点(entry),每个节点可以保存数组或者一个整数值. 7.2 压缩列表节点的构成 每个压缩列表节点可以保存一个字节数组或者一个整数值. 每个压缩列表节点都由previous_entry_length.encoding.content三个部分组成. 7.2.1 pre

Python 学习笔记 - Redis

Redis 和Memcached类似 也是一个开源的内存存储系统,存储格式也是通过键值对的方式.不过和memcached比起来,memcached的value只支持字符串,而redis支持字符串,列表,集合,hash等等:这些数据类型都支持push/pop,add/remove等操作,而且都是原子性的,也就是类似数据库的事物特征一样,所有的操作要么全部完成,要么全部失败,然后回滚到之前的状态. 现在来看看他的简单使用和发布订阅的功能. 服务器安装 [[email protected] ~]# w