Redis学习小结--windows下安装、基本数据类型、持久化及Jedis

  Redis:REmote DIctionary Server 远程字典服务器

    是一个开源免费,ANSI C编写,遵守BSD协议,支持网络, Key-Value分布式内存DB,基于内存运行,支持持久化NoSql DB,数据结构服务器,提供多种语言的API

一:在Window下安装

  s1:下载 Redis-x64-xxx.zip压缩包,解压到D盘后,将文件夹重新命名为 redis;

  s2:cmd,切换到安装目录D盘下:cd /workTools/redis, 运行:redis-server.exe redis.windows.conf 开启服务端

 (别关闭该窗口)

  s3:另开一个cmd, 切换到redis目录下运行 redis-cli.exe -h 127.0.0.1 -p 6379 连接

测试能否使用:方法一:设置键值对 set myKey abc

           取出键值对 get myKey

       方法二: Ping命令 查看服务是否运行  > ping   //连接正常返回 PONG  (#还可用不断的ping来测量延迟值)

二:特点:

     支持数据持久化,可以将内存中数据写入磁盘

     支持数据的备份,即master-slave模式的备份

  工作模式:

     redis:单进程、阻塞
     mem多进程,非阻塞。
     Redis在同一时刻只能处理一个请求,后来的请求需要排队等待
     优点:无需处理并发问题,降低系统复杂度
     缺点:不适合缓存大尺寸对象(超过100kb)

(说明:Memcache是内存对象缓存系统,设计目标为通过缓解数据库的压力来加快web应用的响应速度

    redis应用场景更丰富,Memcache仅适合作为缓存使用

三:Redis支持的键值数据类型

字符串(String)、字符串列表(list)、哈希(hash)、字符串集合(set)、有序字符串集合(zset,sorted set)

1.Key定义注意点:

不要过长(过长消耗内存、降低查找效率)
不要过短 (可读性)
统一的命名规范

Keys的通用操作
显示所有的key: keys *
查询以字符串str开头的key : keys str?
删除多个key: del key1 key2 key3 ...
判断key是否存在,存在返回1不存在返回0 : exists key
对key进行重命名 : rename key newkey
设置过期的时间: expire key times(秒)
剩余时间: ttl key
查看类型 : type key

2.String
在redis中以二进制方式操作
字符串value最多可以容纳数据长度为512M
赋值 set key value
取值 get key
修改 getset key1 value2
删除 del key
增加 incr key (将指定key对应的value值增加1,若无该key,则初始化一个默认为0增加1,若value不为整型,则报错)
减少 decr key (将指定key对应的value值减1,若无该key,则初始化一个默认为0减1)
增加n incrby key n
减少n decrby key n
添加字符串,返回长度 append key str (key不存在则初始化有个,长度为str的长度)

3.Hash:
String Key和String Value的map容器;
一个Hash可以存储 2^32 -1(=4294967295)个键值对

特别适合用于存储对象
设置值:hset hashname key1 val1
设置多个值:hmset hashname key1 val1 key2 val2 = hset hashname key1 val1 key2 val2
获取单个key值:hget hashname key1
获取多个key值:hmget hashname key1 key2
获取全部 hgetall hashname
删除单个/多个key值:hdel hashname key1 key2
增加n hincrby hashname key1 n
判断是否存在 hexists hashname key
包含key的多少 hlen hashname
获取所有key hkeys hashname
获取所有key hvals hashname

4.list

最多可存储 2^32 - 1 元素
存储list常用命令:
两端添加 左侧插入:lpush key value1 value2 value3 ...
右侧插入:rpush key value1 value2 value3
查看列表 lrange key start end (可从0或负数开始结束)
两端弹出 左边弹出 lpop key
右边弹出 rpop key
获取列表元素个数 llen key
key存在才插入左侧 lpushx key value
key存在才插入右侧 rpushx key value
删除 lrem key (+_)startN spevalue (
lrem list 2 3 从头到尾,删除2个3
lrem list -2 1 从尾到头,删除2个1
lrem list 0 2 删除所有2
)
设置某个下标对应value lset key n value
在第一个b之前插入11 linsert list before b 11
在第一个b之后插入22 linsert list after b 22
取出mylist1的右边的一个元素放入mylist2的左边第一个元素前 rpoplpush mylist1 mylist2
rpoplpush list1 list2 将 list1右边的值抛出,压入到list2左边
应用场景:消息队列中,lpush生产者,rpop消费者,
当消费者rpoo一条数据的时候,发发生了错误,那么会导致取出的消息丢失,那么使用rpoplpush-先取出主队列,并插入备份队列,再去处理数据 就可以避免消息丢失

5.set

String类型的无序集合
不允许出现重复的元素
运用场景:跟踪一些唯一性数据、用于维护数据对象之间的关联关系。
其具有的交集,并集,差集运算是非常高效的,基于这个特点我们可以维护数据对象之间的关联关系,比如说从SQL型的数据库中取出数据,然后直接使用redis进行缓存,进行一些快速的运算。
添加: sadd key value1 value2 value3 ...  (成功返回1,如果元素已经在集合中返回0,key对应的set不存在返回错误。)
删除: srem key value1 value2 ....
查看所有:smembers key
某value是否存在: sismember key value
差集(注意key的顺序):sdiff key1 key2
交集:sinter key1 key2
并集(会去重):sunion key1 key2
数量: scard key
随机一个元素 :srandmember key
将两个集合的差集存入新集合:sdiffstore newKey key1 key2
将两个集合的交集存入新集合: sinterstore newKey key1 key2
将两个集合的并集存入新集合: sunionstore newKey key1 key2

6.Sorted-Set (Zset)
与Set的区别:sorted-set:每个成员都有一个double类型的分数与之关联,成员唯一,分数可重复
Sorted-Set中的成员在集合中的位置是有序的
适合存储带分数成绩之类的数据。
应用场景:如大型游戏在线积分排行榜;构建索引数据
添加 zadd sortName scord1 value1 scord2 value2
查分数 (scord1): zscore sortname value
具体成员数:zcard sortname
删除:zrem sortname value1 value2..
按范围删除 zremrangebyrank sortName 0 4
zremrangebyscore sortName 80 100
显示所有元素(按分数升序):zrange sortname 0 -1
显示所有元素及对应分数(按分数升序) zrange sortname 0 -1 withscores
显示所有元素及对应分数(按分数降低序) zrevrange sortname 0 -1 withscores
显示分数在0到100之间的2个元素及对应分数 zrangebyscore sortname 0 100 withscores limit 0 2
给某元素(value)加分数(socre) zincrby sortname score value
某个分数区间的元素个数 zcount sortname 80 90

四:多数据库

  select n:选择数据库,默认连接0号数据库, 一个redis最多有16个实例,从0开始
  move key n:把key移动到n号数据库
支持事务
  multi: 开启事务
  exec: 执行
  discard: 回滚
redis在事务中所有命令都将被串行化顺序执行,事务执行期间 redis不会再为其他的客户端 提供任何的服务 从而保证事务中所有的命令被原子化执行 ,那么和关系型数据库中事务相比 ,redis 中如果某个命令执行失败 ,它后面的命令还会被执行。

五:redis持久化(数据从内存同步到硬盘)

RDB方式 默认支持,不需要配置,指定时间间隔将内存数据集快照写入磁盘 

  优势:

    1.数据库只包含一个文件,通过文件备份策略,定期配置,恢复系统灾难
    2.压缩文件转移到其他介质上
    3.性能最大化,redis开始持久化时,分叉出进程,由子进程完成持久化的工作,避免服务器进程执行I/O操作,启动效率高
  劣势:
    1.无法高可用:系统一定在定时持久化之前宕机,数据还没写入,数据已经丢失
    2.通过fock分叉子进程完成工作,数据集大的时候,服务器需要停止几百毫秒甚至1秒

AOF方式 以日志的形式记录服务器处理的每一个操作,在redis服务器启动之初会读取该文件,重新构建数据库,保证启动后数据库中的数据是完整的
  优势:
    1.同步:
      a.每秒同步:异步完成,效率高,一旦系统宕机,修改的数据丢失
      b.每修改同步:每分钟发生的变化记录到磁盘中,效率低,安全
      c.不同步
    2.日志写入操作采用追加模式append
      a.系统宕机,不影响已存在的内容
      b.写入一半数据,若系统崩溃,下次启动redis,redis-check-aof工具解决数据一致性
    3.如果日志过大,自动重写机制,修改的数据写入到到磁盘文件,创建新文件,记录产生的修改命令,重写切换时,保证数据安全
    4.格式清晰的日志文件,完成数据的重建

六:Jedis

是redis官方首选的Java客户端开发包
commons-pool2-2.3.jar
jedis-2.7.0.jar

public class RedisJava {

  public static void main(String[] args) {
    //连接本地的Redis服务
    Jedis jedis = new Jedis("127.0.0.1");
    System.out.println("连接成功");
    //查看服务是否运行
    System.out.println("服务正在运行:"+jedis.ping());

    //设置redis字符串数据
    jedis.set("key_run", "run_ok");
    //获取存储的数据并输出
    System.out.println("redis存储的字符串为:"+jedis.get("key_run"));

    //存储数据到列表中
    jedis.lpush("list_key", "list_value1");
    jedis.lpush("list_key", "list_value2");
    jedis.lpush("list_key", "list_value3");
    //获取存储的数据并输出
    List<String> list = jedis.lrange("list_key", 0, 2);
    for(int i=0; i<list.size(); i++) {
      System.out.println("列表项为:" + list.get(i));
    }

    //获取数据并输出
    Set<String> keys = jedis.keys("*");
    Iterator<String> it = keys.iterator();
    while(it.hasNext()) {
      String key = it.next();
      System.out.println(key);
    }
  }
}

猜你喜欢

转载自www.cnblogs.com/ranx/p/10143548.html