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

发表评论

提供最优质的资源集合

立即查看 了解详情
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡