Redis总体介绍:

  Redis特性

    •   Redis(REmote DIctionary Server),是一个开源的内存数据库
    •   持久化:RDB、AOF
    •   主备复制
    •   丰富的数据结构
    •   Lua脚本、事务

  Redis常见数据类型

    •   String
    •   List
    •   Hash
    •   Set
    •   Zset
    •   Bitmap、HyperLogLog、GEO

  Redis应用场景

    • 排行榜,zest
    • 计数,String
    • 好友关系, Hash
    • Recerse cache(反向cache),string
    • Top 10, list
    • Fast transcation with lua
    • 用户访问记录,list
    • 抢红包,List、lua、string

Redis数据结构解析

  1、String

    Redis的String是基于C string的封装,在头部存储了长度信息,以便于支持动态扩展,其源码如下所示:

struct sdshdr {
int len; //len表示buf中存储的字符串的长度。
int free; //free表示buf中空闲空间的长度。
char buf[]; //buf用于存储字符串内容。
};

    为了节省内存,当一个字符串符合整数格式的时候mredis会将转换成64位有符号整数

    String结构是简单的key-value类型,value不仅是String,也可以是数字

    常用命令:

        set——设置key对应的值为String类型的value

        get——获取key对应的值

        mget——批量获取多个key的值,如果可以不存在则返回null

        incr &&incrby——incr对key对应的值进行加加操作,并返回新的值;incrby加指定值

        decr && decrby——decr对key对应的值进行减减操作,并返回新的值;decrby减指定值

    static void testString(Jedis jedis){
jedis.set("name","xinxin");//向key-->name中放入了value-->xinxin System.out.println("set:" + jedis.get("name"));//执行结果:xinxin jedis.append("name", " is my lover"); //拼接
System.out.println("append:" + jedis.get("name")); jedis.del("name"); //删除某个键
System.out.println("del:" + jedis.get("name")); //设置多个键值对
jedis.mset("name","liuling","age","23","qq","476777XXX");
System.out.println("mget:" + jedis.mget("name","age","qq","ss")); jedis.incr("age"); //进行加1操作
System.out.println("incr " + jedis.get("age"));
jedis.incrBy("age",2);//进行加任意数操作
System.out.println("incrBy:" + jedis.get("age"));
jedis.decr("age");//进行减1操作
System.out.println("decr:" + jedis.get("age"));
jedis.decrBy("age", 2);//进行减任意数操作
System.out.println("decrby:" + jedis.get("age"));
}

输出:

set:xinxin
append:xinxin is my lover
del:null
mget:[liuling, , 476777XXX, null]
incr
incrBy:
decr:
decrby:      

  2、hash

    Hash是一个String类型的field和value之间的映射表,在redis中Hash数据类型的key(hash表名称)对应的value实际的内部存储结构为一个HashMap,因此Hash特别适合存储对象。相对于把一个对象的每个属性存储为String类型,将整个对象存储在Hash类型中会占用更少内存。

    当前HashMap的实现有两种方式:当HashMap的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,这时对应的value的redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。

    常用命令:

      hset——设置key对应的HashMap中的field的value

      hget——获取key对应的HashMap中的field的value

      hgetall——获取key对应的HashMap中的所有field的value

    static void testHash(Jedis jedis){
//-----添加数据----------
Map<String, String> map = new HashMap<String, String>();
map.put("name", "xinxin");
map.put("age", "22");
map.put("qq", "123456");
jedis.hmset("user",map);
//取出user中的name,执行结果:[minxr]-->注意结果是一个泛型的List
//第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数
List<String> rsmap = jedis.hmget("user", "name", "age", "qq");
System.out.println(rsmap); //删除map中的某个键值
jedis.hdel("user","age");
System.out.println(jedis.hmget("user", "age")); //因为删除了,所以返回的是null
System.out.println(jedis.hlen("user")); //返回key为user的键中存放的值的个数2
System.out.println(jedis.exists("user"));//是否存在key为user的记录 返回true
System.out.println(jedis.hkeys("user"));//返回map对象中的所有key
System.out.println(jedis.hvals("user"));//返回map对象中的所有value
System.out.println(jedis.hgetAll("user"));//返回map对象中的所有key=value Iterator<String> iter=jedis.hkeys("user").iterator();
while (iter.hasNext()){
String key = iter.next();
System.out.println(key+":"+jedis.hmget("user",key));
}
}

输出:

[xinxin, , ]
[null] true
[qq, name]
[, xinxin]
{qq=, name=xinxin}
qq:[]
name:[xinxin]

  3、Set

    set代表一个集合(元素不重复),集合在redis里实现为字典

    如果set里所有都元素都是整数时,redis会以inset都形式存储,inset是一个有序都整形数组

    常用命令:

      sadd——key对应的set中添加一个元素。

      smembers——获取key对应的set的所有元素。

      spop——随机返回并删除key对应的set中的一个元素。

      sdiff——求给定key对应的set与第一个key对应的set的差集

      suion——求给定key对应的set并集

      sinter——求给定key对应的set交集

    static void testSet(Jedis jedis){
//添加
jedis.sadd("user2","liuling");
jedis.sadd("user2","xinxin");
jedis.sadd("user2","ling");
jedis.sadd("user2","zhangxinxin");
jedis.sadd("user2","who");
//移除noname
jedis.srem("user2","who");//移除集合中一个或多个成员
System.out.println(jedis.smembers("use2r"));//获取所有加入的value
System.out.println(jedis.scard("user2"));//返回集合的元素个数
System.out.println(jedis.spop("user2"));//随机返回并删除key对应的set中的一个元素。
System.out.println(jedis.scard("user2"));//返回集合的元素个数
System.out.println(jedis.sismember("user2", "who"));//判断 who 是否是user集合的元素
System.out.println(jedis.srandmember("user2"));//返回集合中一个或多个随机数 }

  4、List

    Redis的List类型其实就是每一个元素都是String类型的双向链表。我们可以从链表的头部和尾部添加或者删除元素。这样的List既可以作为栈,也可以作为队列使用。

    常用命令:

      lpush——将一个或多个值插入到列表头部。

      lrange——获取key对应的list的指定下标范围的元素,-1表示获取所有元素。

      lpop——移出并获取列表的第一个元素

      rpush——在列表中添加一个或多个值

      rpop——移除并获取列表最后一个元素

   static  void testList(Jedis jedis){;
//开始前,先移除所有的内容
jedis.del("java framework");
System.out.println(jedis.lrange("java framework",0,-1));
//先向key java framework中存放三条数据
jedis.lpush("java framework","spring");
jedis.lpush("java framework","struts");
jedis.lpush("java framework","hibernate");
//再取出所有数据jedis.lrange是按范围取出,
// 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有
System.out.println(jedis.lrange("java framework",0,-1)); jedis.del("java framework");
System.out.println(jedis.lrange("java framework",0,-1));
jedis.rpush("java framework","spring");
jedis.rpush("java framework","struts");
jedis.rpush("java framework","hibernate");
System.out.println(jedis.lrange("java framework",0,-1));
}

输出:

[]
[hibernate, struts, spring]
[]
[spring, struts, hibernate]

  5、sorted set

    Redis sorted set和set一样也是string类型元素的集合,且不允许重复的成员。不一样的是每个元素都会有一个double类型的分数。redis会通过分数来为集合中的成员进行从小到大的排序。要注意的是有序集合的成员是唯一的,但分数(score)却可以重复。

    常用命令:

      zadd:向有序集合添加一个或多个成员,或者更新已存在成员的分数

      zcard: 获取有序集合的成员数

      zrange:通过索引区间返回有序集合成指定区间内的成员

    static void testsorted (Jedis jedis){
jedis.zadd("sort",2.3,"a");
jedis.zadd("sort",1.3,"b");
jedis.zadd("sort",4.3,"c");
jedis.zadd("sort",0.3,"d");
jedis.zadd("sort",0.3,"e");
System.out.println("zcard:" + jedis.zcard("sort"));
System.out.println(jedis.zrange("sort",0,1));
System.out.println(jedis.zrange("sort",0,2));
System.out.println(jedis.zrange("sort",0,3));
System.out.println(jedis.zrange("sort",0,4));
}

输出:

[d, e]
[d, e, b]
[d, e, b, a]
[d, e, b, a, c]

更多命令可参考http://www.redis.net.cn/order/

Redis——基础使用的更多相关文章

  1. windows下使用redis,Redis入门使用,Redis基础命令

    windows下使用redis,Redis入门使用,Redis基础命令 >>>>>>>>>>>>>>>> ...

  2. [.net 面向对象程序设计深入](14)Redis——基础

    [.net 面向对象程序设计深入](14)Redis——基础 很长一段时间没更新博客了,坚持做一件事,真不是件容易的事,后面我会继续尽可能的花时间更新完这个系列文章. 因这个系列的文章涉及的范围太大了 ...

  3. linux redis基础应用 主从服务器配置

    Redis基础应用 redis是一个开源的可基于内存可持久化的日志型,key-value数据库redis的存储分为内存存储,磁盘存储和log文件三部分配置文件中有三个参数对其进行配置 优势:和memc ...

  4. [.net 面向对象程序设计深入](36)Redis——基础

    [.net 面向对象程序设计深入](36)Redis——基础 很长一段时间没更新博客了,坚持做一件事,真不是件容易的事,后面我会继续尽可能的花时间更新完这个系列文章. 因这个系列的文章涉及的范围太大了 ...

  5. mysql主从复制、redis基础、持久化和主从复制

    一.mysql(mariadb)基础 1.基础命令(centos7操作系统下) 1.启动mysql systemctl start mariadb 2.linux客户端连接自己 mysql -uroo ...

  6. Redis基础用法、高级特性与性能调优以及缓存穿透等分析

     一.Redis介绍 Redis是一个开源的,基于内存的结构化数据存储媒介,可以作为数据库.缓存服务或消息服务使用.Redis支持多种数据结构,包括字符串.哈希表.链表.集合.有序集合.位图.Hype ...

  7. Redis基础知识补充及持久化、备份介绍(二)--技术流ken

    Redis知识补充 在上一篇博客<Redis基础认识及常用命令使用(一)--技术流ken>中已经介绍了redis的一些基础知识,以及常用命令的使用,本篇博客将补充一些基础知识以及redis ...

  8. Spring-Boot之Redis基础

    Spring-Boot之Redis基础 准备 Redis下载地址:github.com/MSOpenTech/redis/releases Redis数据库的默认端口号是 6379 开启Redis服务 ...

  9. mongodb,Mysql,redis基础教程

    数据库基础 1:mongodb基础教程 1:pymongo基础教程  2:Mysql基础教程 3:redis基础教程

  10. Redis基础知识点面试手册

    Redis基础知识点面试手册 基础 概述 数据类型 STRING LIST SET HASH ZSET(SORTEDSET) 数据结构 字典 跳跃表 使用场景 会话缓存 缓存 计数器 查找表 消息队列 ...

随机推荐

  1. SpringBoot使用Docker快速部署项目

    1.简介 建议阅读本文最好对Dokcer有一些了解 首先我们先了解一下Docker是什么 Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口.它是目前最流行的 Linux 容器 ...

  2. C语言 实验设备管理系统

    实验设备信息管理系统 简单的思路,简单的算法 题目简述:实验室设备信息用文件存储,提供文件的输入输出操作:要能够完成设备的录入和修改,需要提供设备添加和修改操作:实现对设备进行分类统计,需要提供排序操 ...

  3. 【学习笔记】动态规划—斜率优化DP(超详细)

    [学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...

  4. Java文本类型输入与输出

    import java.io.*; import java.time.LocalDate; import java.util.Scanner; public class Test { public s ...

  5. DAX 第二篇:计算上下文

    计算上下文是计算公式的环境,任何DAX表达式都是在上下文中求值的.行上下文和筛选上下文是DAX中仅有的上下文类型,把这两种上下文称为计算上下文.计算上下文用于限定公式计算的环境,当上下文变化时,相同的 ...

  6. a=re.findall('b',c)报错提示:TypeError:expected string or buffer

    目的:想通过findall选取某个unicode编码的字符串列表(列表里面有元组) 问题:报错[TypeError:expected string or buffer] 现在测试下: 定义一个有元组的 ...

  7. youku_androidid

    youku_androidid = 1310; imei screenwidth screenhight

  8. Scrapy爬虫框架与常用命令

    07.08自我总结 一.Scrapy爬虫框架 大体框架 2个桥梁 二.常用命令 全局命令 startproject 语法:scrapy startproject <project_name> ...

  9. File文件类

    目录 File文件类 File类的构造方法 File类的创建功能 File类的重命名 File类的删除功能 File类的判断功能 File类的获取功能 文件名称过滤器 File文件类 File:文件和 ...

  10. vue教程(二)--过滤器和监视改动功能

    过滤器filter: 1.将数据进行添油加醋的操作. 2.过滤器分两种: 组件内的过滤器(组件内有效). 全局过滤器 组件内:filters:{过滤器名:过滤器函数fn},fn内通过return 返回 ...