zoukankan      html  css  js  c++  java
  • 初识redis

    1.redis启动服务的细节
    注意: 直接使用./redis-server方式启动使用的是redis-server这个shell脚本中的默认配置

    2.如何在启动redis时指定配置文件启动
    注意:默认在redis安装完成之后再安装目录没有任何配置文件,需要在源码目录中复制redis.conf配置文件到安装目录

    a.进入源码目录
    cp redis.conf /usr/local/redis

    b.进入/usr/local/redis安装目录查看复制配置文件
    cd /usr/local/redis
    ls

    c.进入bin目录加载配置启动
    ./redis-server ../redis.conf

    3.修改Redis默认端口号
    vim redis.conf 修改里面port 7000 保存并退出

    4.Redis中库的概念
    库:datebase用来存放数据一个基本单元 一个库可以存放key-value键值对 Redis中每一个库都有一个唯一名称|编号 从0开始
    默认库的个数:16个库 库的编号:0-15 默认使用的是0号库:

    切换库的命令:select dbid(库编号)

    5.Redis中清除库的指令

    flushDB 清空当前库
    flushAll 清空所有库

    6.操作key相关的指令

    1.del key[key ...]
    2.exists key [key ...] 存在多个时,只要有一个存在返回1否则返回0
    3.expire key seconds
    作用:为了给key设置一个生存时间,当key过期时(生存时间为0),它会自动删除
    4.keys * 查询所有的key
    (* 匹配任意个数任意字符 ?匹配仅一个任意字符 []匹配的是里边指定的某一个字符)
    5.move
    作用:将当前数据库的key 移动到指定的数据库db 中(move key db)

    小插曲:
    展示中文存的value 这需要在客户端登录时外加 --raw (如:./redis-cli -p 6379 --raw)

    6.pexpire
    作用:它与expire作用差不多,但它是以毫秒为单位设置key的生存时间,expire是以秒为单位

    7.pexpireat key Unix的时间戳

    8.ttl key
    作用:用来返回当前key的剩余生存时间
    返回-1 的key都是永久存储的
    返回-2 代表当前的key不存在
    返回>=0 就代表剩余生存时间

    9.pttl key 返回的剩余的毫秒

    10.randomkey
    作用:从当前数据库中随机返回一个key(不删除)

    11.rename key newkeyname 重新改key的名字,不修改里面的value

    12.type key
    作用:判断key所对应值的类型 如果返回为none说明当前key不存在

    7.Redis类型之 string类型
    key 是string类型 value也是string类型
    string常用的操作命令:

    命令 说明
    set 设置一个key/value 如:set key value
    get 根据key获取对应的value 如:get key
    mset 一次性设置多个key/value 如:set name zhangsan age 18 bir 2018-08-08
    mget 一次性获取多个key/value 如:get name age bir
    getset 获取原始key的值,同时设置新值 如:当前库里边有name zhangsan 我getset name xiaoming 返回的值是zhangsan 但重新get name 返回的值是xiaoming
    strlen 获取对应key存储value的长度 如:当前库里边有name zhangsan 我strlen name 返回的是8 (value的长度)
    append 为对应key的value追加内容 如:当前库里边有name zhangsan 我append name likered 重新 get name 返回的值是zhangsanlikered
    getrange 索引从零开始 截取value内容 -1代表末尾 如:getrange name 0 7
    setex 设置一个key存活的有效期(秒)如:setex age 10 18 (10代表10s,18是age的值)
    psetex 设置一个key存活的有效期(毫秒)
    setnx 存在不做任何操作,不存在则添加 如:setnx name xiaoming 存在name,不做任何操作,不存在name这个key则进行添加
    msetnx 原子操作(只要有一个存在不做任何操作)一次性设置多个key,只要有一个存在就都不保存 如:msetnx name xiaoming age 18
    decr 进行数值类型的-1操作 如:当前库中存在age 18 我decr age 返回 17 可以减到负数
    decrby 根据提供的数据进行减法操作 如:decrby age 10 代表每次age减去10
    incr 根据数值类型+1操作
    incrby 根据提供的数据进行加法操作
    incrbyfloat 根据提供的数据加入浮点数 如:incrbyfloat age 1.454553454354355453454534 返回 18.45455345435435546 (当前最多保留17位小数)

    Redis类型之 List类型

    list列表 相当于Java中的list集合 特点 元素有序且可以重复 (可以往左放入元素 也可以往右放入元素)

    小插曲: ps aux|grop redis (命令 查看进程 ) kill 8168 (杀死进程)

    list常用的操作命令:

    命令 说明
    lpush 将某个值加入到一个key列表头部 如:lpush lists zhangsan xiaoming xiaohei lisi xiaoming(lists 代表key,它后边的值都是key的list类型存放的值)
    lrange 获取某一个下标区间内的元素 如:lrange lists 0 -1 返回 xiaoming lisi xiaohei xiaoming zhangsan (注意:刚刚是从左加入的数据,所以最先加入的数据在最后显示,最后加入的数据最先展示)
    rpush 将某个值加入到一个key列表尾部 如:rpush lists xiaojindou xiaoheidou xiaodoudou 再lrange lists 0 -1 返回xiaoming lisi xiaohei xiaoming zhangsan xiaojindou xiaoheidou xiaodoudou
    lpushx 同lpush 但必须要保证这个key存在(每次只能在列表里放一个元素,当key不存在时,无法像lpush创建key/value)如:lpushx names aaa
    rpushx 同rpush 但必须要保证这个key存在
    lpop 返回和移除列表的第一个元素(左) 如:lpop lists
    rpop 返回和移除列表的第一个元素(右)如:rpop lists
    llen 获取列表元素个数 如:llen lists
    lset 设置某一个指定索引的值(索引必须存在)就是根据下标修改指定下标的值 如:lset lists 1 xxxxx
    lindex 获取某一个指定索引位置的元素 如:lindex lists 1
    lrem 删除重复元素 如:lrem lists 2 zhangsan 意思是删除2个重复的zhangsan 从左边开始匹配
    ltrim 保留列表中特定区间内的元素 如:ltrim lists 1 5 意思是保留第二个到第六个的元素
    linsert 在某一个元素之前,之后插入新的元素 如:linsert lists before xiaoming xiaocheng 意思是将xiaocheng放在xiaoming的前边 linsert lists after xxxxx xiaojindou 意思是将xiaojindou 放在xxxxx的后边


    Redis类型之 Set类型
    特点:set类型set集合 元素无序 不可以重复

    set常用的操作命令:

    命令 说明
    sadd 为集合添加元素 如:sadd sets zhangsan lisi wangwu lisi(重复的元素不会进行添加)
    smembers 返回集合中所有元素 无序 如:smembers sets
    scard 返回集合元素的个数 如:scard sets
    spop 随机返回一个元素并将该元素在集合中删除 如:spop sets
    smove 从一个集合中向另一个集合集合移动元素(两个集合都必须是set类型的集合) 如:当前有集合 ages 18 19 20 和sets zhangsan lisi 我smove sets ages zhangsan
    srem 从集合中删除一个元素 如:srem ages zhangsan 18(可删除多个)
    sismember 判断一个集合中是否含有这个元素 如:sismember sets zhangsan 返回0代表没有返回1代表有
    srandmember 随机返回元素 如:srandmember sets 2 (意思是每次随机返回两个且不删除)
    sdiff 去掉第一个集合中其他集合含有的相同元素 如:库中有 sets1 zhangsan lisi wangwu zhaoliu win7 |sets2 lisi xiaohei |sets3 win7 xiaocheng xiaoming 我sdiff sets1 sets2 (当前返回sets1(sets1去掉sets2相同的元素剩下的集合),sets1和sets2 不变)
    还比如:sdiff sets1 sets2 sets3 意思是返回sets1 与sets2 sets3 去掉相同元素的剩下的集合
    sinter 求交集 如:sinter sets1 sets2 返回lisi 还比如 sinter sets1 sets2 sets3 没有交集返回empty
    sunion 求合集 如:sunion sets1 sets2 sets3 (去除相同元素的合集)

    Redis类型之 Zset类型
    特点:可排序的set集合 排序 不可重复

    zset常用的操作命令:

    命令 说明
    zadd 添加一个有序集合元素 如:zadd zsets 10 zhangsan 9 xiaohei 8 xiaochen 100 xiaoming 15 xiaochen (后边重复的元素会覆盖前面的元素,所以xiaochen是15的这个)
    zcard 返回集合的元素个数 如:zcard zsets
    zrange升序zrevrange降序 返回一个范围内的元素 如:zrange zsets 0 -1 withscores (withscores 展示分数)
    zrangebyscore 按照分数查找一个范围内的元素 如:zrangebyscore zsets 0 20 withscores limit 0 2 (先找符合分数0-20的元素集合在进行limit 0-2的分页)
    zrank 返回排名 如:zrank zsets xiaochen (返回的是当前值在集合中排序的索引值 )
    zrevrank 倒序排名 如:zrevrank zsets xiaochen (返回的是当前值在集合中倒序排序的索引值 )
    zscore 显示某一个元素的分数 如:zscore zsets xiaochen
    zrem 移除某一个元素 如:zrem zsets xiaochen zhangsan
    zincrby 给某个特定元素加分 如:zincrby zsets 1 xiaohei (每次给xiaohei加1分)


    Redis类型之 hash类型
    特点:value 是一个map结构 存在key value key无序的
    key(外) key(内) value

    hash常用的操作命令:

    命令 说明
    hset 设置一个key/value对 如:hset maps name zhangsan
    hget 获取一个key对应的value 如:hget maps name
    hgetall 获得所有的key/value对 如:hgetall maps
    hdel 删除某一个key/value对 如:hdel maps bir
    hexists 判断一个key是否存在 如:hexists maps bir
    hkeys 获得所有的key 如:hkeys maps
    hvals 获得所有的value 如:hvals maps
    hmset 设置多个key/value 如:hmset maps bir 2018-10-10 address beijing
    hmget 获取多个key/value 如:hmget maps bir address
    hsetnx 设置一个不存在的key的值 如:hsetnx maps course redis (key(内) 存在不做处理 key不存在则添加)
    hincrby 为value进行加法运算 如:hincrby maps age 10 (value必须是数值型的)
    hincrbyfloat 为value加入浮点值 如:hincrbyfloat maps age 10.2343545434324343544565654 (原值加浮点值,且保留十七位)

    ======================================
    小插曲:Redis图形化管理工具
    开启Redis远程连接

    注意:默认Redis服务器是没有开启远程连接,也就是默认拒绝所有远程客户端连接
    1.修改配置开启远程连接
    vim redis.conf 修改如下配置
    bind 0.0.0.0 #允许一切客户端连接
    2.修改配置之后重启Redis服务
    ./redis-server ../redis.conf 注意:一定要加载配置文件启动
    =======================================
    8.Redis 持久化机制
    client redis[内存]-->内存数据--数据持久化->磁盘
    Redis提供两种不同的持久化方法来将数据存储到硬盘里面分别是:
    1.快照(snapshot)
    2.aof (append only file) 只追加日志文件

    1.1快照
    特点:这种方式可以将某一时刻的所有数据都写入硬盘中,当然这也是Redis的默认开启持久化方式,保存的文件是以.rbd形式结尾的文件,
    因此这种方式称之为rdb方式。

    快照生成方式:
    1.客户端方式:bgsave 和save命令
    2.服务器配置自动触发

    1.1客户端方式-bgsave
    -a.客户端可以使用bgsave 命令来创建一个快照,当接收到客户端的bgsave命令时,Redis会调用fork`来创建一个进程,然后子进程负责将快照写入磁盘中,
    而父进程继续处理命令请求。

    名词解释:fork当一个进程创建子进程的时候,底层的操作系统会创建该进程的一个副本,在类Unix系统中创建子进程的操作会进行优化:在刚开始的时候,父子进程共享相同内存,直到
    父进程或子进程对内存进行了写之后,对被写入的内存的共享才结束服务。

    小插曲:删除文件命令 rm -rf dump.rdb 查看文件 ll 生成快照 bgsave(background saving started)【fork 进行】|save(ok)【主线程对外阻塞进行,无法对外提供服务】

    1.2客户端方式-save【不常用】
    -b.接受到save命令的Redis服务器在快照创建完毕之前将不再响应任何其他的命令。
    1.3服务器配置方式-满足配置自动触发
    -如果用户在redis.conf设置了save配置选项,redis会在save选项条件满足之后自动触发一次bgsave命令,如果设置多个save配置选项,当任意一个save配置选项条件满足,redis也会触发一次bgsave命令
    1.4服务器接受客户端shutdown命令
    -当redis通过shutdown指令接收到关闭服务器的请求时,会执行一个save命令,阻塞所有的客户端,不在执行客户端执行发送的任何
    命令,并且save命令完毕之后关闭服务器

    1.5配置生成快照名称和位置
    1.修改生成快照名称
    -dbfilename dump.rdb
    2.修改生成位置
    -dir ./

    2.1 aof只追加日志文件
    1.特点
    这种方式可以将所有客户端执行的写命令记录到日志文件中,aof持久化会被执行的写命令写到aof的文件末尾,以此来记录数据发生的变化,
    因此只要redis从头到尾执行一次aof文件所包含的所有写命令,就可以恢复aof文件的记录的数据集。
    2.开启aof持久化
    在redis的默认配置中aof持久化机制是没有开启的,需要在配置中开启
    2.1开启aof持久化
    -a 修改appendonly yes 开启持久化
    -b 修改appendfilename "appendonly.aof" 指定生成文件名称


    小插曲:tail -f appendonly.aof 实时展示

    日志追加频率
    1.always 【谨慎使用】 每个redis写命令都要同步写入硬盘,严重降低redis进度
    2.everysec【推荐】每秒执行一次同步显示的将多个命令到磁盘
    3.no【不推荐】 由操作系统决定何时同步

    adb与aof同时开启,redis会优先选择aof这种方式进行持久化,因为它更加安全。但也有缺点,随着时间的流逝,aof里放的文件写入数据重复磁盘占用较大。

    为了解决aop的这种缺陷,redis提供了aof重写(rewriter)机制

    aof重写:用来在一定程度上减小aof文件的体积

    触发重写方式
    1.客户端方式触发重写
    -执行bgrewriteaof 命令
    2.服务器配置方式自动触发
    -配置redis.conf 的auto-aof-rewrite-percentage选项

    重写的原理:重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,替换原有的文件这点和快照有点相似。

    用户还应该对持久化的文件进行备份(最好备份在多个不同的地方)


    9.Java操作redis

    1.引入:
    <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
    <dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.3.0</version>
    </dependency>

    2.创建jedis对象
    public static void main(String[] args){
    //1.创建jedis对象
    Jedis jedis=new Jedis("192.168.139.128",6379);//1.redis服务必须关闭防火墙2.redis服务必须开启远程连接
    jedis.select(0);
    //2.执行相关操作
    //......
    //3.释放资源
    jedis.close();

    }

    10.SpringBoot操作redis
    spring boot data(数据) redis中提供了RedisTemplate和StringRedisTemplate,其中StringRedisTemplate是RedisTemplate的
    子类,两个方法基本一致,不同之处主要体现在操作的数据类型不同,**RedisTemplate中的两个泛型都是Object,意味着存储的
    key和value都可以是一个对象,而StringRedisTemplate的两个泛型都是String,意味着StringRedisTemplate的key和value都只能
    是字符串。

    注意: 使用RedisTemplate默认是将对象序列化到redis中,所以放入的对象必须实现对象序列化接口。

    10.1环境准备
    1.引入依赖
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    2.配置application.propertie
    spring.redis.host=182.168.139.128
    spring.redis.port=6379
    spring.redis.database=0

    小插曲: 在redis.conf 配置文件中 输入/bind (意思是搜索bind关键字)


    3.使用RedisTemplate key和value都会被序列化,所以第一实体类需要实现序列化接口,第二因为存的是序列化的key,
    终端就不好操作序列化的key,所以就需要把key的object序列的方案改成String类型,这样终端就好进行操作了。
    //修改key 序列化方案
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    //修改hash key 序列化方案
    redisTemplate.setHashKeySerializer(new StringRedisSerializer());

    里边调用的api:redisTemplate.opsForxxxx
    stringRedisTemplate.opsForxxxx
    redisTemplate.xxxx
    stringRedisTemplate.xxxx

    4.绑定api spring data 为了方便我们对redis进行更加友好的操作 因此有提供了bound api 简化操作
    有这样一种情况:
    如果以后有对一个key要做n多种操作,可以对它进行绑定处理。


    里边调用的api:redisTemplate.boundxxxxOps
    stringRedisTemplate.boundxxxxOps

    11.redis 的应用场景
    1.利用redis中字符类型完成, 项目中手机验证码存储的实现
    2.利用redis中字符串类型完成 具有失效业务功能 12306 淘宝 订单还有:30分钟
    3.利用redis分布式集群系统中session共享 memcache 内存 数据存储上限 数据类型比较简单 redis 内存
    4.利用redis zset类型 可排序set类型 元素 分数 排行榜之类的功能
    5.利用redis 分布式缓存 实现
    6.利用redis 存储认证之后token信息 微信小程序 微信公众号 |用户 openid -->令牌
    7.利用redis 解决分布式集群系统中分布式锁问题 jvm syschronize

  • 相关阅读:
    【转】前端开发工程师如何在2013年里提升自己
    【转】再谈PHP、Python与Ruby
    【转】从知乎上看到“全栈开发者”讨论之后的自黑
    C#精髓 第四讲 GridView 72般绝技
    web网站第一次加载慢的解决方法
    SQL SERVER 提供了一些时间函数:
    Eval() 中数据格式化或格式化数据
    SQL SERVER 取本月上月日期
    LINQ to SQL连接数据库及语句
    权限管理
  • 原文地址:https://www.cnblogs.com/pmbb/p/14081593.html
Copyright © 2011-2022 走看看