Redis笔记(上)

Redis 概述

 

  单线程+多路IO复用(Redis)

  • Redis是一个开源的key-value存储系统。
  • Memcached类似,它支持存储的value类型相对更多,包括string(字符串)list(链表)set(集合)zset(sorted set --有序集合)hash(哈希类型)。
  • 这些数据类型都支持push/popadd/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
  • 在此基础上,Redis支持各种不同方式的排序。
  • memcached一样,为了保证效率,数据都是缓存在内存中。
  • 区别的是Redis周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。
  • 并且在此基础上实现了master-slave(主从)同步。

 

Redis安装与使用

  docker拉取redis镜像

docker pull redis

 

 

   docker配置挂载文件

mkdir -p /home/redis/redis/myredis

 

 

 

   启动redis容器

docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name myredis -v /home/redis/myredis/myredis.conf:/etc/redis/redis.conf -v /home/redis/myredis/data:/data -d redis redis-server /etc/redis/redis.conf  --appendonly yes  --requirepass 000415

 

–restart=always 总是开机启动
–log是日志方面的
-p 6379:6379 将6379端口挂载出去
–name 给这个容器取一个名字
-v 数据卷挂载
/home/redis/myredis/myredis.conf:/etc/redis/redis.conf 这里是将 liunx 路径下的myredis.conf 和redis下的redis.conf 挂载在一起。
/home/redis/myredis/data:/data 这个同上
-d redis 表示后台启动redis
redis-server /etc/redis/redis.conf 以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录 /etc/redis/redis.conf 也就是liunx下的/home/redis/myredis/myredis.conf
–appendonly yes 开启redis 持久化
–requirepass 000415 设置密码 (如果你是通过docker 容器内部连接的话,就随意,可设可不设。但是如果想向外开放的话,一定要设置)


  进入容器进行测试

#命令:docker exec -it <容器名> /bin/bash

docker exec -it myredis redis-cli

  

  测试式例

  •   验证密码

 

 

Redis(key常用操作命令)

  • keys *查看当前库所有key    (匹配keys *1)
  • exists key判断某个key是否存在
  • type key 查看你的key是什么类型
  • del key       删除指定的key数据
  • unlink key   根据value选择非阻塞删除
  • 仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作。
  • expire key 10   10秒钟:为给定的key设置过期时间
  • ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已过期
  • select命令切换数据库
  • dbsize查看当前数据库的key的数量
  • flushdb清空当前库
  • flushall通杀全部库

 

Redis字符串(String常用操作命令)

  • set   <key><value>添加键值对
  • get   <key>查询对应键值
  • append  <key><value>将给定的<value> 追加到原值的末尾
  • strlen  <key>获得值的长度
  • setnx  <key><value>只有在 key 不存在时    设置 key 的值
  • incr  <key>
  • key 中储存的数字值增1
  • 只能对数字值操作,如果为空,新增值为1
  • decr  <key>
  • key 中储存的数字值减1
  • 只能对数字值操作,如果为空,新增值为-1
  • incrby / decrby  <key><步长> key 中储存的数字值增减。自定义步长。
  • mset  <key1><value1><key2><value2>  .....

      同时设置一个或多个 key-value对  

      mget  <key1><key2><key3> .....

      同时获取一个或多个 value  

  • msetnx <key1><value1><key2><value2>  .....

      同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。

      原子性,有一个失败则都失败

  • getrange  <key><起始位置><结束位置>

      获得值的范围,类似java中的substring前包,后包

      setrange  <key><起始位置><value>

      用 <value>  覆写<key>所储存的字符串值,从<起始位置>开始(索引从0开始)。

  • setex  <key><过期时间><value>

      设置键值的同时,设置过期时间,单位秒。

  • getset <key><value>

      以新换旧,设置了新值同时获得旧值。

Redis列表(List常用操作命令)

  • lpush/rpush  <key><value1><value2><value3> .... 从左边/右边插入一个或多个值。
  • lpop/rpop  <key>从左边/右边吐出一个值。值在键在,值光键亡。
  • rpoplpush  <key1><key2><key1>列表右边吐出一个值,插到<key2>列表左边。
  • lrange <key><start><stop>
  • 按照索引下标获得元素(从左到右)
  • lrange mylist 0 -1   0左边第一个,-1右边第一个,(0-1表示获取所有)
  • lindex <key><index>按照索引下标获得元素(从左到右)
  • llen <key>获得列表长度
  • linsert <key>  before <value><newvalue><value>的后面插入<newvalue>插入值
  • lrem <key><n><value>从左边删除nvalue(从左到右)
  • lset<key><index><value>将列表key下标为index的值替换成value

 

Redis集合(Set常用操作命令)

  • sadd <key><value1><value2> .....
  • 将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略
  • smembers <key>取出该集合的所有值。
  • sismember <key><value>判断集合<key>是否为含有该<value>值,有1,没有0
  • scard<key>返回该集合的元素个数。
  • srem <key><value1><value2> .... 删除集合中的某个元素。
  • spop <key>随机从该集合中吐出一个值。
  • srandmember <key><n>随机从该集合中取出n个值。不会从集合中删除 
  • smove <source><destination>value把集合中一个值从一个集合移动到另一个集合
  • sinter <key1><key2>返回两个集合的交集元素。
  • sunion <key1><key2>返回两个集合的并集元素。
  • sdiff <key1><key2>返回两个集合的差集元素(key1中的,不包含key2中的)

Redis哈希(Hash常用操作命令)

  • hset <key><field><value>给<key>集合中的  <field>键赋值<value>
  • hget <key1><field>从<key1>集合<field>取出 value
  • hmset <key1><field1><value1><field2><value2>... 批量设置hash的值
  • hexists<key1><field>查看哈希表 key 中,给定域 field 是否存在。
  • hkeys <key>列出该hash集合的所有field
  • hvals <key>列出该hash集合的所有value
  • hincrby <key><field><increment>为哈希表 key 中的域 field 的值加上增量 1   -1
  • hsetnx <key><field><value>将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 .

Redis有序集合Zset(sorted set)常用命令操作

  • zadd  <key><score1><value1><score2><value2>
  • 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
  • zrange <key><start><stop>  [WITHSCORES]   

  • 返回有序集 key 中,下标在<start><stop>之间的元素
  • WITHSCORES,可以让分数一起和值返回到结果集。
  • zrangebyscore key minmax [withscores] [limit offset count]
  • 返回有序集 key 中,所有 score 值介于 min max 之间(包括等于 min max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
  • zrevrangebyscore key maxmin [withscores] [limit offset count]               
  • 同上,改为从大到小排列。
  • zincrby <key><increment><value>      为元素的score加上增量
  • zrem  <key><value>删除该集合下,指定值的元素
  • zcount <key><min><max>统计该集合,分数区间内的元素个数
  • zrank <key><value>返回该值在集合中的排名,从0开始。

 

Redis配置文件介绍

  bind:默认情况bind=127.0.0.1只能接受本机的访问请求,不写的情况下,无限制接受任何ip地址的访问

  protected-mode:将本机访问保护模式设置no

  port:端口号,默认 6379

  tcp-backlog:设置tcpbacklogbacklog其实是一个连接队列,backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列。tcp-backlog  511

  timeout:一个空闲的客户端维持多少秒会关闭,0表示关闭该功能。即永不关闭。

  tcp-keepalive:对访问客户端的一种心跳检测,每个n秒检测一次。单位为秒,如果设置为0,则不会进行Keepalive检测,建议设置成60

  daemonize:是否为后台进程,设置为yes守护进程,后台启动

  pidfile:存放pid文件的位置,每个实例会产生一个不同的pid文件

  loglevel:指定日志记录级别,Redis总共支持四个级别:debugverbosenoticewarning,默认为notice

  logfile:日志文件名称(可以写具体路径) 

  databases:设定库的数量 默认16默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id

  requirepass:访问密码的查看、设置和取消在命令中设置密码只是临时的重启redis服务器密码就还原了永久设置需要再配置文件中进行设置

 

Redis的发布和订阅

什么是发布和订阅

  Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。Redis 客户端可以订阅任意数量的频道。

发布订阅命令行实现

   打开一个客户端订阅channel1

 

 

 

   

  打开另一个客户端,给channel1发布消息hello

 

 

 

Redis新数据类型 

  Bitmaps

    Redis提供了Bitmaps这个“数据类型”可以实现对位的操作:

    (1) Bitmaps本身不是一种数据类型, 实际上它就是字符串(key-value) , 但是它可以对字符串的位进行操作。

    (2) Bitmaps单独提供了一套命令, 所以在Redis中使用Bitmaps和使用字符串的方法不太相同。 可以把Bitmaps想象成一个以位为单位的数组, 数组的每个单元只能存储01, 数组的下标在Bitmaps中叫做偏移量。

    (3)对比集合set 数据海量时Bitmaps占用内存少,但是在数据量少时,这时候使用Bitmaps就不太合适了, 因为基本上大部分位都是0

 

 

 

  命令

    1setbit

 

    (1)格式

 

      setbit<key><offset><value>设置Bitmaps中某个偏移量的值(01

 

 

      *offset:偏移量从0开始

    

    (2)实例

 

      每个独立用户是否访问过网站存放在Bitmaps中, 将访问的用户记做1, 没有访问的用户记做0, 用偏移量作为用户的id设置键的第offset个位的值(从0算起),假设现在有20个用户,userid=16111519的用户对网站进行了访问, 那么当前Bitmaps初始化结果如图

 

 

      unique:users:20220905代表2022-09-05这天的独立访问用户的Bitmaps

 

 

 

    2getbit

    (1)格式

      getbit<key><offset>获取Bitmaps中某个偏移量的值

 

    (2)实例

 

      获取id=6的用户是否在2022-09-05这天访问过, 返回0说明没有访问过:

 

 

 

 

    3bitcount

      统计字符串被设置为1bit一般情况下,给定的整个字符串都会被进行计数,通过指定额外的 start end 参数,可以让计数只在特定的位上进行。start end 参数的设置,都可以使用负数值:比如 -1 表示最后一个位,而 -2 表示倒数第二个位,startend 是指bit组的字节的下标数,二者皆包含。

    (1)格式

      bitcount<key>[start end] 统计字符串从start字节到end字节比特值为1的数量

 

    (2)实例

 

      计算2022-09-05这天的独立访问用户数量

 

 

 

    4bitop

 

    (1)格式

 

      bitop  and(or/not/xor) <destkey> [key…]

      bitop是一个复合操作, 它可以做多个Bitmapsand(交集) 、 or(并集) 、 not(非) 、 xor(异或) 操作并将结果保存在destkey中。

 

 

 

  计算出任意一天都访问过网站的用户数量(例如月活跃就是类似这种) 可以使用or求并集

 

 

 

HyperLogLog

  pfadd   pfadd <key>< element> [element ...]   添加指定元素到 HyperLogLog

 

 

 

 

 

 

 

 

 

  pfcount       pfcount<key> [key ...] 计算HLL的近似基数,可以计算多个HLL,比如用HLL存储每天的UV,计算一周的UV可以使用7天的UV合并计算即可

 

 

 

 

  pfmerge        pfmerge<destkey><sourcekey> [sourcekey ...]  将一个或多个HLL合并后的结果存储在另一个HLL中,比如每月活跃用户可以使用每天的活跃用户来合并计算可得

 

 

 

 

 

Geospatial

  geoadd  geoadd<key>< longitude><latitude><member> [longitude latitude member...]   添加地理位置(经度,纬度,名称)

 

 

 

  geopos  geopos  <key><member> [member...]  获得指定地区的坐标值

 

 

 

  geodist  geodist<key><member1><member2>  [m|km|ft|mi ]  获取两个位置之间的直线距离

 

 

  georadius  georadius<key>< longitude><latitude>radius  m|km|ft|mi   以给定的经纬度为中心,找出某一半径内的元素经度 纬度 距离 单位

 

 

 

Redis_Jedis_测试

  Jedis所需要的jar

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.2.0</version>
        </dependency>

  测试

public class JedisDemo1 {
    public static void main(String[] args) {
        //创建Jedis对象
        Jedis jedis = new Jedis("192.168.254.128",6379);

        //测试
        String ping = jedis.ping();
        System.out.println(ping);
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-09-04 10:49  Homnay  阅读(38)  评论(0)    收藏  举报