最新公告
  • 欢迎您光临欧资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • redis

    # Redis

    Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

    ###### Redis 与其他 key – value 缓存产品有以下三个特点

    “`java
    /*
    Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
    Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
    Redis支持数据的备份,即master-slave模式的数据备份。 */
    “`

    redis优势

    “`java
    /*
    性能极高 : Redis能读的速度是110000次/s,写的速度是81000次/s 。
    丰富的数据类型 : Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
    原子 : Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
    丰富的特性 : Redis还支持 publish/subscribe, 通知, key 过期等等特性。
    */
    “`

    ###### Redis与其他key-value存储有什么不同?

    “`java
    /*
    Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
    Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
    */
    “`

    ##### 存储类型:

    ###### Hash(哈希)

    Redis hash 是一个键值(key=>value)对集合。

    Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

    “`java
    //DEL runoob 用于删除前面测试用过的 key,不然会报错:(error) WRONGTYPE Operation against a key holding the wrong kind of value

    redis 127.0.0.1:6379> DEL runoob
    redis 127.0.0.1:6379> HMSET runoob field1 “Hello” field2 “World”
    “OK”
    redis 127.0.0.1:6379> HGET runoob field1
    “Hello”
    redis 127.0.0.1:6379> HGET runoob field2
    “World”
    “`

    ###### List(列表)

    Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

    “`
    redis 127.0.0.1:6379> DEL runoob
    redis 127.0.0.1:6379> lpush runoob redis
    (integer) 1
    redis 127.0.0.1:6379> lpush runoob mongodb
    (integer) 2
    redis 127.0.0.1:6379> lpush runoob rabitmq
    (integer) 3
    redis 127.0.0.1:6379> lrange runoob 0 10
    1) “rabitmq”
    2) “mongodb”
    3) “redis”
    redis 127.0.0.1:6379>
    “`

    ###### Set(集合)

    Redis 的 Set 是 string 类型的无序集合。

    集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

    **sadd 命令**

    添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0。

    “`
    sadd key member
    “`

    “`java
    redis 127.0.0.1:6379> DEL runoob
    redis 127.0.0.1:6379> sadd runoob redis
    (integer) 1
    redis 127.0.0.1:6379> sadd runoob mongodb
    (integer) 1
    redis 127.0.0.1:6379> sadd runoob rabitmq
    (integer) 1
    redis 127.0.0.1:6379> sadd runoob rabitmq
    (integer) 0
    redis 127.0.0.1:6379> smembers runoob

    1) “redis”
    2) “rabitmq”
    3) “mongodb”
    /*以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。
    集合中最大的成员数为 232 – 1(4294967295, 每个集合可存储40多亿个成员)。
    */
    “`

    ###### zset(sorted set:有序集合)

    Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

    不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

    zset的成员是唯一的,但分数(score)却可以重复。

    **zadd 命令**

    添加元素到集合,元素在集合中存在则更新对应score

    “`
    zadd key score member
    “`

    “`
    redis 127.0.0.1:6379> DEL runoob
    redis 127.0.0.1:6379> zadd runoob 0 redis
    (integer) 1
    redis 127.0.0.1:6379> zadd runoob 0 mongodb
    (integer) 1
    redis 127.0.0.1:6379> zadd runoob 0 rabitmq
    (integer) 1
    redis 127.0.0.1:6379> zadd runoob 0 rabitmq
    (integer) 0
    redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
    1) “mongodb”
    2) “rabitmq”
    3) “redis”
    “`

    ###### 各个数据类型应用场景:

    | 类型 | 简介 | 特性 | 场景 |
    | ——————– | —————————————————— | ———————————————————— | ———————————————————— |
    | String(字符串) | 二进制安全 | 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M | — |
    | Hash(字典) | 键值对集合,即编程语言中的Map类型 | 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) | 存储、读取、修改用户属性 |
    | List(列表) | 链表(双向链表) | 增删快,提供了操作某一段元素的API | 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列 |
    | Set(集合) | 哈希表实现,元素不重复 | 1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 | 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐 |
    | Sorted Set(有序集合) | 将Set中的元素增加一个权重参数score,元素按score有序排列 | 数据插入集合时,已经进行天然排序 | 1、排行榜 2、带权重的消息队列 |

    ##### 命令

    ###### 建

    “`
    redis 127.0.0.1:6379> SET runoobkey redis
    OK
    redis 127.0.0.1:6379> DEL runoobkey
    (integer) 1
    “`

    **Redis keys 命令**

    | 序号 | 命令及描述 |
    | —- | ———————————————————— |
    | 1 | [DEL key](https://www.runoob.com/redis/keys-del.html) 该命令用于在 key 存在时删除 key。 |
    | 2 | [DUMP key](https://www.runoob.com/redis/keys-dump.html) 序列化给定 key ,并返回被序列化的值。 |
    | 3 | [EXISTS key](https://www.runoob.com/redis/keys-exists.html) 检查给定 key 是否存在。 |
    | 4 | [EXPIRE key](https://www.runoob.com/redis/keys-expire.html) seconds 为给定 key 设置过期时间,以秒计。 |
    | 5 | [EXPIREAT key timestamp](https://www.runoob.com/redis/keys-expireat.html) EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。 |
    | 6 | [PEXPIRE key milliseconds](https://www.runoob.com/redis/keys-pexpire.html) 设置 key 的过期时间以毫秒计。 |
    | 7 | [PEXPIREAT key milliseconds-timestamp](https://www.runoob.com/redis/keys-pexpireat.html) 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计 |
    | 8 | [KEYS pattern](https://www.runoob.com/redis/keys-keys.html) 查找所有符合给定模式( pattern)的 key 。 |
    | 9 | [MOVE key db](https://www.runoob.com/redis/keys-move.html) 将当前数据库的 key 移动到给定的数据库 db 当中。 |
    | 10 | [PERSIST key](https://www.runoob.com/redis/keys-persist.html) 移除 key 的过期时间,key 将持久保持。 |
    | 11 | [PTTL key](https://www.runoob.com/redis/keys-pttl.html) 以毫秒为单位返回 key 的剩余的过期时间。 |
    | 12 | [TTL key](https://www.runoob.com/redis/keys-ttl.html) 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。 |
    | 13 | [RANDOMKEY](https://www.runoob.com/redis/keys-randomkey.html) 从当前数据库中随机返回一个 key 。 |
    | 14 | [RENAME key newkey](https://www.runoob.com/redis/keys-rename.html) 修改 key 的名称 |
    | 15 | [RENAMENX key newkey](https://www.runoob.com/redis/keys-renamenx.html) 仅当 newkey 不存在时,将 key 改名为 newkey 。 |
    | 16 | [TYPE key](https://www.runoob.com/redis/keys-type.html) 返回 key 所储存的值的类型。 |

    ###### Redis 字符串(String)

    “`
    redis 127.0.0.1:6379> COMMAND KEY_NAME
    “`

    实例

    “`
    redis 127.0.0.1:6379> SET runoobkey redis
    OK
    redis 127.0.0.1:6379> GET runoobkey
    redis
    “`

    **Redis 字符串命令**

    下表列出了常用的 redis 字符串命令:

    | 序号 | 命令及描述 |
    | —- | ———————————————————— |
    | 1 | [SET key value](https://www.runoob.com/redis/strings-set.html) 设置指定 key 的值 |
    | 2 | [GET key](https://www.runoob.com/redis/strings-get.html) 获取指定 key 的值。 |
    | 3 | [GETRANGE key start end](https://www.runoob.com/redis/strings-getrange.html) 返回 key 中字符串值的子字符 |
    | 4 | [GETSET key value](https://www.runoob.com/redis/strings-getset.html) 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 |
    | 5 | [GETBIT key offset](https://www.runoob.com/redis/strings-getbit.html) 对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 |
    | 6 | [MGET key1 [key2..\]](https://www.runoob.com/redis/strings-mget.html) 获取所有(一个或多个)给定 key 的值。 |
    | 7 | [SETBIT key offset value](https://www.runoob.com/redis/strings-setbit.html) 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 |
    | 8 | [SETEX key seconds value](https://www.runoob.com/redis/strings-setex.html) 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。 |
    | 9 | [SETNX key value](https://www.runoob.com/redis/strings-setnx.html) 只有在 key 不存在时设置 key 的值。 |
    | 10 | [SETRANGE key offset value](https://www.runoob.com/redis/strings-setrange.html) 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。 |
    | 11 | [STRLEN key](https://www.runoob.com/redis/strings-strlen.html) 返回 key 所储存的字符串值的长度。 |
    | 12 | [MSET key value [key value …\]](https://www.runoob.com/redis/strings-mset.html) 同时设置一个或多个 key-value 对。 |
    | 13 | [MSETNX key value [key value …\]](https://www.runoob.com/redis/strings-msetnx.html) 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。 |
    | 14 | [PSETEX key milliseconds value](https://www.runoob.com/redis/strings-psetex.html) 这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。 |
    | 15 | [INCR key](https://www.runoob.com/redis/strings-incr.html) 将 key 中储存的数字值增一。 |
    | 16 | [INCRBY key increment](https://www.runoob.com/redis/strings-incrby.html) 将 key 所储存的值加上给定的增量值(increment) 。 |
    | 17 | [INCRBYFLOAT key increment](https://www.runoob.com/redis/strings-incrbyfloat.html) 将 key 所储存的值加上给定的浮点增量值(increment) 。 |
    | 18 | [DECR key](https://www.runoob.com/redis/strings-decr.html) 将 key 中储存的数字值减一。 |
    | 19 | [DECRBY key decrement](https://www.runoob.com/redis/strings-decrby.html) key 所储存的值减去给定的减量值(decrement) 。 |
    | 20 | [APPEND key value](https://www.runoob.com/redis/strings-append.html) 如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。 |

    ##### java web代码

    “`java
    package org.hdax.dm.controller;

    import org.hdax.dm.entity.user.Users;
    import org.hdax.dm.service.UsersService;
    import org.hdax.dm.utils.exception.DmException;
    import org.hdax.dm.vo.common.CommonResponse;
    import org.hdax.dm.vo.VoUtil;
    import org.hdax.dm.vo.user.UserRequest;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.web.bind.annotation.*;

    import java.util.HashMap;
    import java.util.Map;
    import java.util.Random;
    import java.util.concurrent.TimeUnit;

    @RestController
    public class SmsController {

    @Autowired
    StringRedisTemplate redisTemplate;
    @Autowired
    private UsersService usersService;

    // 定义方法获取验证码
    @PostMapping(path = “/getCode”)
    public CommonResponse> getCode(@RequestBody UserRequest userRequest){
    // 根据手机号查询数据库中是否存在(存在:进行发送/不存在:不发送返回)
    Users users = usersService.login(userRequest.getPhone());
    if (users == null){
    return VoUtil.returnFail(“1008”,new DmException(“用户不存在!请先注册!”));
    }
    // 进行生成验证码
    int minCode = 100000;
    int maxCode = 999999;
    Random random = new Random();
    int code = random.nextInt(maxCode);
    if (code result = new HashMap();
    result.put(“message”,true);
    return VoUtil.returnSuccess(result);
    }

    // 定义短信验证方法进行登录
    @RequestMapping(path = “/login”,method = RequestMethod.POST)
    public CommonResponse> login(@RequestBody UserRequest userRequest){
    Map result = new HashMap();
    // 获取验证码(是否获取/是否过期)
    String c = redisTemplate.opsForValue().get(“smscode_”+userRequest.getPhone());
    // 判断验证码是否为空
    if (c == null){
    result.put(“message”,”请获取验证码!!!”);
    return VoUtil.returnFail(“1008”,new DmException(result.get(“message”).toString()));
    }else if (!c.equals(userRequest.getVcode())){
    result.put(“message”,”验证码错误!!!”);
    return VoUtil.returnFail(“1008”,new DmException(result.get(“message”).toString()));
    }else{
    result.put(“message”,”登录成功!!!”);
    redisTemplate.delete(“smscode_”+userRequest.getPhone());
    return VoUtil.returnSuccess(result);
    }
    }
    }

    “`

    ##### java使用

    需要下载 :[jedis-2.9.0.jar](https://static.runoob.com/download/jedis-2.9.0.jar)

    ###### 连接到 redis 服务

    “`java

    import redis.clients.jedis.Jedis;

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

    “`

    ###### Redis Java String(字符串) 实例

    “`java

    import redis.clients.jedis.Jedis;

    public class RedisStringJava {
    public static void main(String[] args) {
    //连接本地的 Redis 服务
    Jedis jedis = new Jedis(“localhost”);
    System.out.println(“连接成功”);
    //设置 redis 字符串数据
    jedis.set(“runoobkey”, “www.runoob.com”);
    // 获取存储的数据并输出
    System.out.println(“redis 存储的字符串为: “+ jedis.get(“runoobkey”));
    }
    }

    “`

    ###### Redis Java List(列表) 实例

    “`java

    import java.util.List;
    import redis.clients.jedis.Jedis;

    public class RedisListJava {
    public static void main(String[] args) {
    //连接本地的 Redis 服务
    Jedis jedis = new Jedis(“localhost”);
    System.out.println(“连接成功”);
    //存储数据到列表中
    jedis.lpush(“site-list”, “Runoob”);
    jedis.lpush(“site-list”, “Google”);
    jedis.lpush(“site-list”, “Taobao”);
    // 获取存储的数据并输出
    List list = jedis.lrange(“site-list”, 0 ,2);
    for(int i=0; i keys = jedis.keys(“*”);
    Iterator it=keys.iterator() ;
    while(it.hasNext()){
    String key = it.next();
    System.out.println(key);
    }
    }
    }

    “`

    站内大部分资源收集于网络,若侵犯了您的合法权益,请联系我们删除!
    欧资源网 » redis

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    欧资源网
    一个高级程序员模板开发平台

    发表评论