安装 redis
直接输入命令安装 如图所示:
sudo apt-get install redis-server
安装完成后,Redis服务器会自动启动。
使用
ps -aux|grep redis 命令可以看到服务器系统进程默认端口6379,如图所示:
接下来会执行完成,我们可以看到包括redis的版本信息等,执行service redis status 可以查看redis服务的状态为running,说明安装完成系统自动启动了服务,如图所示:
配置 redis 服务
1. 开启远程链接
找到/et/redis/redis.conf文件修改如下 ,注释掉 127.0.0.1 #bind 127.0.0.1,如果不需要远程连接redis则不需要这个操作
2.修改密码
找到/et/redis/redis.conf文件修改如下,添加 requirepass duke123(密码设置为duke123)
修改完成后,必须要重启配置文件。sudo /etc/init.d/redis-server restart
未使用密码登陆Redis服务器
使用密码登陆Redis服务器
远程测试登录
Redis的数据结构
- Redis 命令参考:doc.redisfans.com/
- try Redis(不用安装Redis即可体验Redis命令):try.redis.io/
首先还是得声明一下,Redis的存储是以key-value的形式的。Redis中的key一定是字符串,value可以是string、list、hash、set、sortset这几种常用的。
1.String 字符串类型
是redis中最基本的数据类型,一个key对应一个value。
String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。
基础使用:get、set 、del、keys、exists、append、strlen
127.0.0.1:6379> set key1 v1 # set值
OK
127.0.0.1:6379> get key1 # get value
"v1"
127.0.0.1:6379> keys * # 得到所有的key
1) "key1"
127.0.0.1:6379> exists key1 # 是否存在对应的key
(integer) 1
127.0.0.1:6379> del key1 # 删除key
(integer) 1
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> exists key1
(integer) 0
127.0.0.1:6379> append key1 666 # 向后面添加额外的字符串
(integer) 3
127.0.0.1:6379> get key1
"666"
127.0.0.1:6379> append key1 777
(integer) 6
127.0.0.1:6379> get key1
"666777"
127.0.0.1:6379> strlen key1 #字符串长度
(integer) 6
进阶使用:incr、decr、incrby、decrby、getrange、setex(set with expice)、setnx(set if no exist)、ttl、mset、mget、getset
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views # 自增1
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views # 自减1
(integer) 1
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incrby views 10 # 自增10 步数为10
(integer) 10
127.0.0.1:6379> decrby views 10 # 自减步数为10
(integer) 0
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> set duke "hello,duke666"
OK
127.0.0.1:6379> getrange duke 0 3 # 第1位到第4位
"hell"
127.0.0.1:6379> getrange duke 0 -1 # 终点位-1是 显示全部
"hello,duke666"
127.0.0.1:6379> set duke1 abcdefg
OK
127.0.0.1:6379> setrange duke1 1 11 # 替换指定位置开始的字符串
(integer) 7
127.0.0.1:6379> get duke1
"a11defg"
127.0.0.1:6379> setex aaa 60 "duke" # 设置 60s后过期
OK
127.0.0.1:6379> ttl aaa # 查看时间
(integer) 56
127.0.0.1:6379> ttl aaa
(integer) 52
127.0.0.1:6379> get aaa
(nil)
127.0.0.1:6379> setnx bbb "redis" # 设置值 如果不存在就设置进去并且返回1 如果存在就设置不进去返回0
(integer) 1
127.0.0.1:6379> setnx bbb "ubuntu" # 没设置进去返回
(integer) 0
127.0.0.1:6379> get bbb
"redis"
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 # 批量set值
OK
127.0.0.1:6379> mget k1 k2k3 # 批量get值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> getset a b # 先get 在set 如果不存在就set这个值
(nil)
127.0.0.1:6379> get a
"b"
127.0.0.1:6379> getset a c # 如果存在就get原来的值 然后set新的值进去
"b"
127.0.0.1:6379> get a
"c"
String 使用的场景:计数器、防止并发
2.List类型
基本数据类型:list 基本使用:lpush、lrange、rpush、lpop、rpop、lindex、llen、lrem、ltrim、rpoplpush、exists、lset、linsert、
127.0.0.1:6379> lpush list1 one # 将一个值或者多个值放在列表的头部
(integer) 1
127.0.0.1:6379> lpush list1 two
(integer) 2
127.0.0.1:6379> lpush list1 three
(integer) 3
127.0.0.1:6379> lrange list1 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list1 0 1
1) "three"
2) "two"
127.0.0.1:6379> rpush list1 right 将一个值或者多个值放在列表的尾部
(integer) 1
127.0.0.1:6379> lrange list1 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> lpop list1 # 移除左边的
"three"
127.0.0.1:6379> rpop list1 #移除右边的
"right"
127.0.0.1:6379> lrange list1 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list1 0 # 获得第0个元素
"two"
127.0.0.1:6379> lindex list1 1 # 获得第1个元素
"one"
127.0.0.1:6379> llen list1 # 获取长度
(integer) 2
127.0.0.1:6379> lrange list1 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lrem list1 1 one # 移除 前面是个数后面是value
(integer) 1
127.0.0.1:6379> lrange list1 0 -1
1) "two"
127.0.0.1:6379> lpush mylist "hello1" "hello2" "hello3" "hello4"
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello4"
2) "hello3"
3) "hello2"
4) "hello1"
127.0.0.1:6379> ltrim mylist 1 2 # 截取第1个到第2个 会改变原来的数据
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello3"
2) "hello2"
127.0.0.1:6379> rpoplpush mylist mylist2 # 将mylist的最后一个值放入mylist2中
"hello2"
127.0.0.1:6379> lrange mylist 0 -1
1) "hello3"
127.0.0.1:6379> lrange mylist2 0 -1
1) "hello2"
127.0.0.1:6379> exists list # 是否存在
(integer) 0
127.0.0.1:6379> lset list 1 v1 # 将v1 替换第1个元素 无list报错
(error) ERR no such key
127.0.0.1:6379> lpush list v0 v1
(integer) 2
127.0.0.1:6379> lset list 1 v2 # 有 设置成功
OK
127.0.0.1:6379> lrange list 0 -1
1) "v1"
2) "v2"
127.0.0.1:6379> lpush list "hello"
(integer) 1
127.0.0.1:6379> lpush list "world"
(integer) 2
127.0.0.1:6379> linsert list before "world" "test" # 在指定位置前后添加
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "test"
2) "world"
3) "hello"
3.set类型
set中的值无序的不能重复 常用: sadd,smembers,sismember,scard,srem,srandmember,spop,smove
127.0.0.1:6379> sadd set1 "hello" "world" #设置值进set
(integer) 2
127.0.0.1:6379> smembers set1 # 从set中取出所有值
1) "world"
2) "hello"
127.0.0.1:6379> sismember set1 hello #查询一个值是否存在
(integer) 1
127.0.0.1:6379> sismember set1 duke
(integer) 0
127.0.0.1:6379> scard set1 #查询set个数
(integer) 2
127.0.0.1:6379> srem set1 "hello" # 移除set1 里面的hello元素
(integer) 1
127.0.0.1:6379> smembers set1
1) "world"
127.0.0.1:6379> sadd set1 a b c d e f g
(integer) 7
127.0.0.1:6379> srandmember set1 1 # 随机抽取指定个数元素
1) "f"
127.0.0.1:6379> srandmember set1 1
1) "b"
127.0.0.1:6379> spop set1 # 随机删除指定的元素
"g"
127.0.0.1:6379> smembers set1
1) "b"
2) "c"
3) "f"
4) "a"
5) "e"
6) "d"
127.0.0.1:6379> sadd myset "hello" "world" "duke"
(integer) 3
127.0.0.1:6379> smove myset myset2 "duke" // 移除一个元素到另外一个set中
(integer) 1
127.0.0.1:6379> smembers myset2
1) "duke"
127.0.0.1:6379> sadd myset1 a b c
(integer) 3
127.0.0.1:6379> sadd myset2 c d e
(integer) 3
127.0.0.1:6379> sdiff myset1 myset2 # 取差集
1) "b"
2) "a"
127.0.0.1:6379> sinter myset1 myset2 # 取交集
1) "c"
127.0.0.1:6379> sunion myset1 myset2 # 取并集
1) "d"
2) "c"
3) "a"
4) "b"
5) "e"
4.hash类型
就相当于Map集合,key-map value是一个 map 集合 hset,hget,hmset,hmget,hgetall,hlen, hexists,hkeys,hvals,hincrby,hsetnx
127.0.0.1:6379> hset myhash f1 v1 # 设置一个hash类型
(integer) 1
127.0.0.1:6379> hget myhash f1 # 得到一个hash类型
"v1"
127.0.0.1:6379> hmset myhash f1 hello f2 world # 批量设置一个hash类型重复覆盖
OK
127.0.0.1:6379> hmget myhash f1 f2 # 批量得到一个hash类型
1) "hello"
2) "world"
127.0.0.1:6379> hgetall myhash # 得到所有的key value
1) "f1"
2) "hello"
3) "f2"
4) "world"
127.0.0.1:6379> hmset myhash f1 v1 f2 v2 f3 v3
OK
127.0.0.1:6379> hlen myhash # 获取hash的长度
(integer) 3
127.0.0.1:6379> hexists myhash f1 # 判断hash中指定是否存在 存在为1 不存在为0
(integer) 1
127.0.0.1:6379> hexists myhash f5
(integer) 0
127.0.0.1:6379> hkeys myhash # 获得所有的字段
1) "f1"
2) "f2"
3) "f3"
127.0.0.1:6379> hvals myhash# 获得所有的值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> hincrby myhash f4 1 # 自增 只能针对数字
(integer) 2
127.0.0.1:6379> hincrby myhash f4 -1
(integer) 1
127.0.0.1:6379> hsetnx myhash f4 duke # 判断是否存在 不存在就创建返回1 存在返回0
(integer) 0
127.0.0.1:6379> hsetnx myhash f5 duke
(integer) 1
5.Zset类型
Zset 是一个有序集合,在set的基础上,增加了一个值,set k1 v1 zset k1 score1 v1, zadd,zrange,ZRANGEBYSCORE,zrem,zcard,zcount
127.0.0.1:6379> zadd myset 1 one # 设置一个set类型
(integer) 1
127.0.0.1:6379> zadd myset 2 two
(integer) 1
127.0.0.1:6379> zadd myset 3 three
(integer) 1
127.0.0.1:6379> zrange myset 0 -1 # 查看所有
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> zadd salary 2500 one
(integer) 1
127.0.0.1:6379> zadd salary 500 two
(integer) 1
127.0.0.1:6379> zadd salary 5000 three
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf # 排序 升序排列 负无穷到正无穷 只能最小值到最大值
1) "two"
2) "one"
3) "three"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores # 排序携带额外的信息
1) "two"
2) "500"
3) "one"
4) "2500"
5) "three"
6) "5000"
127.0.0.1:6379> zrem salary one # 移除
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "two"
2) "three"
127.0.0.1:6379> zcard salary # 当前有序集合的数量
(integer) 2
127.0.0.1:6379> zadd myset 1 h 2 w 3 d
(integer) 3
127.0.0.1:6379> zcount myset 1 2 # 获得指定区间的成员数量
(integer) 2
127.0.0.1:6379> zcount myset 1 3
(integer) 3
springboot 集成 redis
1.添加依赖包
新建一个springboot项目,在项目的pom.xml中添加如下依赖:
<!-- redis依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置 redis 数据连接
#redis配置
#Redis服务器地址
spring.redis.host=127.0.0.1
#Redis服务器连接端口
spring.redis.port=6379
#Redis数据库索引(默认为0)
spring.redis.database=0
#连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=50
#连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=3000
#连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=20
#连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=2
#连接超时时间(毫秒)
spring.redis.timeout=5000
3.测试
写一个controller来对redis缓存进行测试:
@Autowired
private RedisTemplate<String, String> redisTemplate;
@RequestMapping("/getString")
public String getString(String key) {
return redisTemplate.opsForValue().get(key);
}
@RequestMapping("/setString")
public void setString(@RequestParam("key") String key, @RequestParam("value") String value) {
redisTemplate.opsForValue().set(key, value);
}
@RequestMapping("/delete")
public void delete(String key) {
redisTemplate.delete(key);
}
存入一个key为key1 value为value1的字段http://localhost:8080/setString?key=key1&value=value1
127.0.0.1:6379> keys *
1) "key1"
取出key为key1的字段http://localhost:8080/getString?key=key1
删除key为key1的字段
http://localhost:8080/delete?key=key1
127.0.0.1:6379> keys *