目录
数据类型
常用命令(Redis 教程_redis教程)
官网更全,点击上方m链接
字符串string操作命令:
set key value 设置指定key的值
get key 获取指定key的值
setex key seconds value 设置指定key的值,将key的过期时间设为seconds秒(应用于验证码)
setnx key value 只有在key不存在时设置key的值(应用于分布式锁)
127.0.0.1:6379> set name xiaoming
OK
127.0.0.1:6379> get name
"xiaoming"
127.0.0.1:6379> get age
(nil) //空
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> set age 30
OK
127.0.0.1:6379> get age
"30" //若key已经存在对应的value会被覆盖
127.0.0.1:6379> setex city 10 beijing
OK
127.0.0.1:6379> get city
"beijing"
127.0.0.1:6379> get city //10秒后city记录被删除
(nil)
127.0.0.1:6379> setnx key1 value1
(integer) 1
127.0.0.1:6379> setnx key1 value2
(integer) 0
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379>
哈希hash操作命令:
Redis hash是一个string类型的 field和value的映射表,特别适合用于存储对象。
127.0.0.1:6379> hset 001 name xiaoming //将哈希表中的key中的字段field的值设为value
(integer) 1
127.0.0.1:6379> hset 001 age 20
(integer) 1
127.0.0.1:6379> hget 001 name //找哈希表中的key中的字段field对应的值value
"xiaoming"
127.0.0.1:6379> hget 001 age
"20"
127.0.0.1:6379> hdel 001 age //删除哈希表中的key中的字段field及其value值
(integer) 1
127.0.0.1:6379> hget 001 age
(nil)
127.0.0.1:6379> hkeys 001 //获取哈希表中的key中的所有field
1) "name"
127.0.0.1:6379> hset 001 age 20
(integer) 1
127.0.0.1:6379> hkeys 001
1) "name"
2) "age"
127.0.0.1:6379> hvals 001 //获取哈希表中的key中的所有field对应的值
1) "xiaoming"
2) "20"
127.0.0.1:6379> hgetall 001 //获取哈希表中的key中的所有field和其对应的value
1) "name"
2) "xiaoming"
3) "age"
4) "20"
127.0.0.1:6379> get 002 a
(error) ERR wrong number of arguments for 'get' command
127.0.0.1:6379> hget 002 abc
(nil)
127.0.0.1:6379>
列表list操作命令
Redis列表是简单的字符串列表,按照插入的顺序排序。
127.0.0.1:6379> lpush mylist a b c
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> lpush mylist it
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "it"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lpush mylist a
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1 //包含重复
1) "a"
2) "it"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> rpop mylist
"a"
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "it"
3) "c"
4) "b"
127.0.0.1:6379> rpop mylist
"b"
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "it"
3) "c"
127.0.0.1:6379> llen mylist
(integer) 3
127.0.0.1:6379> brpop mylist 10
1) "mylist"
2) "c"
127.0.0.1:6379> brpop mylist 10
1) "mylist"
2) "it"
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
127.0.0.1:6379> brpop mylist 10
1) "mylist"
2) "a"
127.0.0.1:6379> lrange mylist 0 -1
(empty list or set)
127.0.0.1:6379> brpop mylist 10
(nil)
(10.08s)
127.0.0.1:6379>
集合set操作命令:
Redis set是string类型的无序集合,集合成员是唯一的。
127.0.0.1:6379> sadd myset a b c d
(integer) 4
127.0.0.1:6379> smembers myset
1) "b"
2) "d"
3) "c"
4) "a"
127.0.0.1:6379> sadd myset a b
(integer) 0
127.0.0.1:6379> smembers myset
1) "d"
2) "c"
3) "a"
4) "b"
127.0.0.1:6379> scard myset
(integer) 4
127.0.0.1:6379> sadd myset2 a b x y
(integer) 4
127.0.0.1:6379> smembers myset2
1) "x"
2) "b"
3) "y"
4) "a"
127.0.0.1:6379> sinter myset myset2
1) "b"
2) "a"
127.0.0.1:6379> sunion myset myset2
1) "b"
2) "x"
3) "d"
4) "c"
5) "y"
6) "a"
127.0.0.1:6379> sdiff myset myset2
1) "d"
2) "c"
127.0.0.1:6379> sdiff myset2 myset
1) "x"
2) "y"
127.0.0.1:6379> srem myset a b c
(integer) 3
127.0.0.1:6379> smembers myset
1) "d"
127.0.0.1:6379>
有序集合sorted set操作命令:
Redis sorted set有序集合是string类型元素的集合,且不允许有重复的成员,每个元素都会关联一个double类型的分数(score),通过分数来为集合中的成员进行从小到大排序,分数可以重复。
127.0.0.1:6379> zadd myset3 10.0 a 9.0 b
(integer) 2
127.0.0.1:6379> zrange myset3 0 -1
1) "b"
2) "a"
127.0.0.1:6379> zadd myset3 9.9 c
(integer) 1
127.0.0.1:6379> zrange myset3 0 -1
1) "b"
2) "c"
3) "a"
127.0.0.1:6379> zrange myset3 0 -1 withscores
1) "b"
2) "9"
3) "c"
4) "9.9000000000000004"
5) "a"
6) "10"
127.0.0.1:6379> zincrby myset3 20 b
"29"
127.0.0.1:6379> zrange myset3 0 -1
1) "c"
2) "a"
3) "b"
127.0.0.1:6379> zrem myset3 b
(integer) 1
127.0.0.1:6379> zrange myset3 0 -1
1) "c"
2) "a"
127.0.0.1:6379>
通用命令:
127.0.0.1:6379> keys *
1) "myset2"
2) "001"
3) "myset"
4) "name"
5) "age"
6) "key1"
7) "myset3"
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists abc
(integer) 0
127.0.0.1:6379> type name
string
127.0.0.1:6379> type myset3
zset
127.0.0.1:6379> type myset2
set
127.0.0.1:6379> type 001
hash
127.0.0.1:6379> ttl name
(integer) -1
127.0.0.1:6379> setex test 100 itcccc
OK
127.0.0.1:6379> keys (
(empty list or set)
127.0.0.1:6379> keys *
1) "myset2"
2) "001"
3) "test"
4) "myset"
5) "name"
6) "age"
7) "key1"
8) "myset3"
127.0.0.1:6379> ttl test
(integer) 78
127.0.0.1:6379> ttl tetst
(integer) -2
127.0.0.1:6379> ttl test
(integer) 67
127.0.0.1:6379> del test
(integer) 1
127.0.0.1:6379> keys *
1) "myset2"
2) "001"
3) "myset"
4) "name"
5) "age"
6) "key1"
7) "myset3"
127.0.0.1:6379> del name age 001
(integer) 3
127.0.0.1:6379> keys *
1) "myset2"
2) "myset"
3) "key1"
4) "myset3"
127.0.0.1:6379> type key1
string
127.0.0.1:6379>
在java中操作redis
这里用jedis的java客户端。
Spring 对redis客户端进行了整合,提供了Spring Data Redis,在Spring Boot项目中还提供了对应的starter。
使用 Jedis操作Redis的步骤:
- 获取连接
- 执行操作
- 关闭连接
创建一个maven工程,其依赖坐标有:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
创建一个测试类test
public class test {
@Test
public void testRedis(){
// 获取连接
Jedis jedis = new Jedis("localhost", 6379);
// 执行操作
jedis.set("username","root");
// 关闭连接
jedis.close();
}
}
执行结果:
127.0.0.1:6379> get username //程序执行前
(nil)
127.0.0.1:6379> get username //程序执行后
"root"
127.0.0.1:6379>
其他命令类似。
下面演示,在springboot的项目中操作redis。
在创建springboot项目时选中如下图:
在application.yml中做如下配置:
spring:
application:
name: redis_demo
redis:
host: localhost
port: 6379
# password: 123456
database: 0
# 0号数据库
jedis:
pool:
max-active: 8
max-wait: 1ms
max-idle: 4
min-idle: 0
创建一个测试类001test
package com.example.redis_demo;
@SpringBootTest
@RunWith(SpringRunner.class)
public class test001 {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testString(){
redisTemplate.opsForValue().set("city","hangzhou");
}
}
运行该测试类,在客户端窗口输入命令 发现找不到city
查找所有会发现,springboot帮我们加上了很多前缀,解决这个问题需要设置序列化器。
创建一个config类
package com.example.redis_demo.config;
import org.springframework.cache.jcache.config.JCacheConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig extends JCacheConfigurerSupport {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}
即可解决,虽然value此时还是有很多前缀,但是取数据时会自动反序列化。
如:
操作其他数据类型则需要加入以下类似操作,以List为例: