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结构来存储,主要有两种方式存储:
- 将用户的id作为用户ID作为查找key,把其他信息封装成一个对象以序列化的凡是存储,这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象却会,并且修改操作需要对并发进行保护,引入CAS等复杂问题
- 该用户信息对象由多少成员就存储多少个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)]