Redis基本命令

Redis键命令用于管理redis的键

DEL key :删除key (可同时删除多个key ,执行结束放回删除成功的数目)

DUMP key :序列化给定的key,返回被序列号的值

EXISTS key : 检查key是否存在

EXPIRE key : 检查给定key是否存在

EXPIRE key seconds : 为给定key设置过期时间(单位:秒)

TTL key : 以为单位,返回给定key的剩余生存时间(TTL,time to live)

PTTL key : 以毫秒为单位返回key的剩余的时间

PERSIST key : 移除key的过期时间,key将持久保持

KEYS pattern :

  • 查找所有符合给定模式的key
  • keys 通配符 获取所有与pattern匹配的key,返回所有与该匹配
  • 通配符:
  • * : 表示所有
  • ? : 表示代表一个字符

RANDOM key : 随机放回一个key

RENANE key newkey : 重命名key

MOVE key db : 将key移动到另一个库中

TYPE key :

  • 返回key的类型
  • String(字符)
  • hash(哈希)
  • list(列表)
  • set(集合)
  • zset(有序集合)
  • …zs

select index : 切换数据库(index表示索引,从0开始,例如 select 1 表示切换到第二个数据库)

基本命名规范

  • key不要太长,尽量不要超过1024字节
  • key不要过短,减低可读性
  • 统一命名模式: user: 123:password;(通过命名来对应表结构)
  • 区分大小写

Redis数据类型

String

String简介

String是redis最基本的数据类型,一个key对应一个value

String类型是二进制安全的。意思是redis的String可以包含任何数据。比如jpg图片或者序列化对象

String类型是Redis最基本的数据类型,一个键最大能存储512MB

二进制安全是指:在传输数据是,保证二进制数据的信息安全,也就是不被篡改,破译等,如果被攻击,能够及时检测出来。

二进制安全特点:

  • 编码、解码在客户端完成,执行效率高
  • 不需要频繁的编解码,不会出现乱码

String命令

赋值命令:

SET KEY_NAME VALUE : 设置给定key的值,如果key存在,则覆盖,且无视类型

SETNX key value : 只有在key不存在时才赋值,(SET if Not eXist)

MSET key value [key value...] : 同时设置一个或多个 key-value

取值命令:

GET KEY_NAME : 获取key对应的值,不存在时返回nil,如果存储的不是String类型,返回错误

GETRANGE key start end : 接触key对应字符串值的范围, start end 表示偏移量(包括start end 在内)

GETBIT key offset : 对key所存储的字符串值,获取指定偏移量上的位(bit)

MGET key1 [key2...] : 获取多个给定key的值

GETSET KEY_NAME VALUE : 设置指定key的值,并放回key的旧值,当key不存在,返回nil

STRLEN key : 返回key所存储字符串值的长度,

删除语法

del key : 删除指定类型的key,如果存在,返回值数字类型

自增/自减

INCR KEY_Name : 将key中储存的数字值增1,key不存在,则key会被初始化为0,然后在执行自增操作。

INCRBY KEY_Name number : 将key中储存的数字值增加指定的值

DECR KEY_Name : 将key中储存的数字减1

DECRBY KEY_Name number : 将key中储存的数字减少指定的值

APPEND key_Name value: 字符串拼接, 不存在则变成赋值

Hash(哈希)

hash简介

Redis hash是一个String类型的field和value的映射表,hash特别适合用于存储对象。Redis中每个哈希可以存储2的三十二次方 - 1 个就键值对(40亿多),

可以看成是具有KEY和VALUE的MAP容器,该类型非常适合于存储值对象的信息。

Hash命令

赋值命令

HSET KEY FIELD VALUE: 为指定的KEY, 设置FIELD/VALUE

HMSET KEY FIELD VALUE [FIELD1 VALUE1...]: 为指定的KEY, 设置多个FIELD-VALUE的值

取值命令:

HGET KEY FIELD: 取值,根据FIELD获取value的值

HMGET key filed[field1 ...]:多个取值,根据FIELD获取value的值

HGETALL key: 获取key所有的字段和值

HKEYS key: 获取哈希表中所有字段

HLEN key: 获取哈希表中字段的数量

删除语法

HDEL key field1 [field2]: 删除字段

其他语法

HSETNX key field value: field不存在才为字段赋值

HINCRBY key field incremnet: 指定的整数字段增加increment

HINCRBYFLOAT key field increment: 指定的浮点数字段增加increment

HEXISTS key field: 查看字段是否存在

应用场景

1、常用于存储一个对象

2、为什么不用String存储一个对象?

hash是最接近关系型数据库结果的数据类型,可以将数据库一条记录或程序中一个对象转换成hashmap存放在redis中。

用户id为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储,主要有两种方式存储:

  1. 将用户的id作为用户ID作为查找key,把其他信息封装成一个对象以序列化的凡是存储,这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象却会,并且修改操作需要对并发进行保护,引入CAS等复杂问题
  2. 该用户信息对象由多少成员就存储多少个key-value对,使用 用户+ID+对应属性的名称作为唯一标识,来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费比较大、

总结:

Redis提供Hash很好的解决了这个问题,Redis的Hash实际是内部存储Value为一个HashMap,并提供了直接存取这个Map成员的接口

java中使用Redis

java操作Jedis

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B5gsSn0W-1571141413797)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1563785582690.png)]

java编写 demo

public static void main(String[] args) {
    //连接Redis服务器-----------端口号+ip地址
    Jedis jedis = new Jedis("192.168.1.1",6379);
    //权限认证------服务器设置的redis客户端密码
    jedis.auth("123");
    //ping测试
    boolean connectionTest = jedis.ping();
    System.out.prinln(jedis.ping());
}

操作命令以方法的形式来调用:

  • set方法(多个重载)
  • get方法(多个重载)
  • exist方法

Java Jedis 连接池优化

public static void main(String[] args) {
	//创建连接池配置对象 Redis POOL 基本配置信息
	JedisPoolCOnfig poolConfig = new JedisPoolConfig();
 	//通过set方法初始化连接池的基本配置信息
 	poolConfig.setMaxTotal(5); //最大连接数
 	poolConfig.setMaxIdle(1); //最大空闲数
 	...
 	
 	//创建连接池 ----配置信息, ip地址或域名, 端口号
 	JedisPool pool = new JedisPoll(poolConfig, host, port); 
 	
    //获取连接对象
    Jedis jedis = pool.getResource();
    
    
    //权限认证------服务器设置的redis客户端密码
    jedis.auth("123");
    //ping测试
    boolean connectionTest = jedis.ping();
    System.out.prinln(jedis.ping());
     
}

Jedis hash操作

提供对应的方法操作:

  • hexist()
  • hget()
  • hset()

Jedis仅仅提供了简单调用语句的方法:

  • 引用类型数据与hash(哈希)的转化还需要自己编写工具类来完成,以及其他操作
  • RedisUtil工具类网上有很多

RedisTemplate

简介

Spring data 提供了 RedisTemplate模板

它封装了redis连接池管理的逻辑,业务代码无须关心获取,释放连接逻辑,

spring redis同时支持了Jedis,Jredis,rjc客户端操作

在Redistemplate中提供了几个常用的接口方法的使用,如下:

private ValueOperations<K,V> valueOps;
private ListOperations<K,V> listOps;
private SetOperations<K,V> setOps; 
private ZSetOperations<K,V> zSOps;

Spring Data 使用 RedisTemplate模板

导入依赖:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hdbbwFXw-1571141413798)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1563791394523.png)]

对应实体Bean进行序列化操作:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ouAPUBVy-1571141413799)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1563791463960.png)]

编写对应配置文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mJNziqdT-1571141413799)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1563791514095.png)]

调用RedisTemplate提供的方法完成相关操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PwWYrO0A-1571141413799)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1563871828863.png)]

注意:

  • 把任何数据保存到redis中,都需要进行序列化
  • 默认使用JdkSerializationRedisSerializer进行数据序列化
  • 所有的key和value嗨哟偶hashkey 和hashvalue的原始字符前,都加了一串字符。
  • 通过配置,可以取消添加序列化字符串
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ODDCZ0oq-1571141413800)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1563792967991.png)]