步骤一:command:[root@localhost redis]# make
步骤二:command:[root@localhost redis]# make install
1、修改ip绑定
#bind 127.0.0.1 说明:redis.conf配置文件默认没有注释此行,表示redis服务器只允许本机连接redis.
2、关闭保护模式
protected-mode no 说明:redis.conf配置文件默认此行为protected-mode yes,将yes修改为no。
3、开启后台启动
daemonize yes 说明:redis.conf配置文件默认此行为ademonize no,将no修改为yes。
1、启动redis服务:[root@localhost redis]# redis-server redis.conf
2、检查redis服务项:[root@localhost redis]# ps -ef | grep redis
3、进入redis客户端:[root@localhost redis]# redis-cli -p 6379
说明:如果ip与端口是默认值,则可以将ip与端口省略。
4、关闭redis服务:
方法1:command:[root@localhost redis]# redis-cli -p 6379 shutdown
方法2:kill -9 pid号,例如:
command:[root@localhost redis]# kill -9 14515
说明:使用[root@localhost redis]# ps -ef | grep redis命令查看pid号
1、set 添加key-value 案例:set username damin
2、get 根据key获取数据 案例:get username
3、strlen 根据key获取值的长度 案例:strlen username
4、exists 判断key是否存在 案例:exists username 说明:返回1表示存在,返回0表示不存在
5、del 删除redis中的key 案例:del username
6、keys 用于查询符合条件的key
(1)keys 星号 查询redis中全部的key
(2)keys usern?me 使用占位符获取数据
(3)keys usern* 获取以usern开头的数据
7、mset 赋值多个key-value 案例:mset key1 value1 key2 value2 key3 value3
8、mget 获取多个key的值 案例:mget key1 key2
9、append 对某个key的值进行追加 案例:append key value
10、type 查看某个key的类型 案例:type key
11、select 切换redis数据库 案例:select 1 说明:redis中共有16个数据库,编号分别为0-15,默认为第0个数据库
12、flushdb 清空单个数据库
13、flushall 清空全部数据库
14、incr 自动加1 案例:incr key
15、decr 自动减1 案例:decr key
16、incrby 按指定数值添加 案例:incrby key 10
17、decrby 按指定数值减 案例:decrby key 10
18、expire 指定key的失效时间,单位s 案例:expire key 20 说明:key在20s后被删除
19、pexpire 指定key的失效时间,单位ms 案例:pexpire key 2000 说明:key在2000ms后被删除
20、ttl 查看key的剩余存活时间 案例:ttl key 说明:-2表示数据不存在,-1表示该数据永不超时
21、persist 撤销key的失效时间 案例:persist key
<!--SpringBoot整合Redis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
package com.jt;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
import redis.clients.jedis.params.SetParams;
import java.util.List;
import java.util.Map;
import java.util.Set;
//实现redis测试
public class TestRedis {
@Test
public void test01(){
Jedis jedis = new Jedis("192.168.126.129", 6379);
jedis.set("2007", "redis入门案例");
System.out.println(jedis.get("2007"));
}
@Test
public void test02(){
Jedis jedis = new Jedis("192.168.126.129", 6379);
if(!jedis.exists("2007")){
//判断是否有key对应的数据,如果没有则新增数据,如果有则放弃新增
jedis.set("2007", "测试案例2222");
}
System.out.println(jedis.get("2007"));
jedis.setnx("2007", "测试高级用法"); //setnx();如果有数据,则不做处理
System.out.println(jedis.get("2007"));
}
/*向redis中添加数据,添加超时时间100s
隐藏bug:代码执行过程中,如果报错,则可能删除失败
原子性:要么同时成功,要么同时失败
解决方案:将入库操作与删除操作一起执行;jedis.setex("2007", 100, "测试时间");
*/
@Test
public void test03() throws InterruptedException {
Jedis jedis = new Jedis("192.168.126.129", 6379);
//jedis.set("2007", "测试时间");
//jedis.expire("2007", 100);
//Thread.sleep(3000);
jedis.setex("2007", 100, "测试时间");
System.out.println(jedis.ttl("2007") + "秒");
}
/*service:
1、如果数据存在,则不操作数据;setnx
2、同时设定超时时间,注意原子性;setex
参数说明:
private static final String XX = "xx"; 只有key存在,则进行操作
private static final String NX = "nx"; 没有key,进行写操作
private static final String PX = "px"; 毫秒
private static final String EX = "ex"; 秒
*/
@Test
public void test04() throws InterruptedException {
Jedis jedis = new Jedis("192.168.126.129", 6379);
SetParams setParams = new SetParams();
setParams.nx().ex(100);
jedis.set("2007", "aaa", setParams);
System.out.println("2007");
}
@Test
public void testHash() {
Jedis jedis = new Jedis("192.168.126.129", 6379);
jedis.hset("person", "id", "18");
jedis.hset("person", "name", "hash测试");
jedis.hset("person", "age", "18");
Map<String, String> map = jedis.hgetAll("person");
Set<String> set = jedis.hkeys("person"); //获取所有的key
List<String> list = jedis.hvals("person");
}
@Test
public void testList() {
Jedis jedis = new Jedis("192.168.126.129", 6379);
jedis.lpush("list", "1", "2", "3", "4", "5");
System.out.println(jedis.rpop("list"));
}
@Test
public void testTransaction() {
Jedis jedis = new Jedis("192.168.126.129", 6379);
//1、开启事务
Transaction transaction = jedis.multi();
try {
transaction.set("a", "a");
transaction.set("b", "b");
transaction.set("c", "c");
transaction.exec(); //提交事务
} catch (Exception e) {
transaction.discard();
}
}
}
sadd key member [member …]
添加一个或多个指定的member元素到集合的 key中.指定的一个或者多个元素member 如果已经在集合key中存在则忽略.如果集合key不存在,则新建集合key,并添加member元素到集合key中.如果key的类型不是集合则返回错误.
返回值:integer-reply:返回新成功添加到集合里元素的数量,不包括已经存在于集合中的元素.
例子:
redis> sadd myset "Hello"
(integer) 1
redis> sadd myset "World"
(integer) 1
redis> sadd myset "World"
(integer) 0
redis> smembers myset
1) "World"
2) "Hello"
redis>
scard key
返回集合存储的key的基数 (集合元素的数量).
返回值:integer-reply: 集合的基数(元素的数量),如果key不存在,则返回 0.
例子:
redis> sadd myset "Hello"
(integer) 1
redis> sadd myset "World"
(integer) 1
redis> scard myset
(integer) 2
redis>
sdiff key [key …]
返回一个集合与给定集合的差集的元素.不存在的key认为是空集.
返回的集合元素是第一个key的集合与后面所有key的集合的差集
返回值:array-reply:结果集的元素.
redis> sadd key1 "a"
(integer) 1
redis> sadd key1 "b"
(integer) 1
redis> sadd key1 "c"
(integer) 1
redis> sadd key2 "c"
(integer) 1
redis> sadd key2 "d"
(integer) 1
redis> sadd key2 "e"
(integer) 1
redis> sdiff key1 key2
1) "a"
2) "b"
redis>
sdiffstore destination key [key …]
该命令类似于 sdiff, 不同之处在于该命令不返回结果集,而是将结果存放在destination集合中.
如果destination已经存在, 则将其覆盖重写.
返回值:integer-reply: 结果集元素的个数.
例子:
redis> sadd key1 "a"
(integer) 1
redis> sadd key1 "b"
(integer) 1
redis> sadd key1 "c"
(integer) 1
redis> sadd key2 "c"
(integer) 1
redis> sadd key2 "d"
(integer) 1
redis> sadd key2 "e"
(integer) 1
redis> sdiffstore key key1 key2
(integer) 2
redis> smembers key
1) "b"
2) "a"
redis>
sinter key [key …]
返回指定所有的集合的成员的交集.
返回指定所有的集合的成员的交集.
返回值:array-reply: 结果集成员的列表.
redis> sadd key1 "a"
(integer) 1
redis> sadd key1 "b"
(integer) 1
redis> sadd key1 "c"
(integer) 1
redis> sadd key2 "c"
(integer) 1
redis> sadd key2 "d"
(integer) 1
redis> sadd key2 "e"
(integer) 1
redis> sinter key1 key2
1) "c"
redis>
sinterstore destination key [key …]
这个命令与sinter命令类似, 但是它并不是直接返回结果集,而是将结果保存在 destination集合中.
如果destination 集合存在, 则会被重写.
返回值:integer-reply: 结果集中成员的个数.
例子:
redis> sadd key1 "a"
(integer) 1
redis> sadd key1 "b"
(integer) 1
redis> sadd key1 "c"
(integer) 1
redis> sadd key2 "c"
(integer) 1
redis> sadd key2 "d"
(integer) 1
redis> sadd key2 "e"
(integer) 1
redis> sinterstore key key1 key2
(integer) 1
redis> smembers key
1) "c"
redis>
sismember key member
返回成员 member 是否是存储的集合 key的成员.
返回值:integer-reply,详细说明:
1、如果member元素是集合key的成员,则返回1
2、如果member元素不是key的成员,或者集合key不存在,则返回0
例子:
redis> SADD myset "one"
(integer) 1
redis> sismember myset "one"
(integer) 1
redis> sismember myset "two"
(integer) 0
redis>
smembers key
返回key集合所有的元素.
该命令的作用与使用一个参数的sinter命令作用相同.
返回值:array-reply:集合中的所有元素.
例子:
redis> sadd myset "Hello"
(integer) 1
redis> sadd myset "World"
(integer) 1
redis> smembers myset
1) "World"
2) "Hello"
redis>
smove source destination member
将member从source集合移动到destination集合中. 对于其他的客户端,在特定的时间元素将会作为source或者destination集合的成员出现.
如果source 集合不存在或者不包含指定的元素,这smove命令不执行任何操作并且返回0.否则对象将会从source集合中移除,并添加到destination集合中去,如果destination集合已经存在该元素,则smove命令仅将该元素充source集合中移除. 如果source 和destination不是集合类型,则返回错误.
返回值:integer-reply
1、如果该元素成功移除,返回1
2、如果该元素不是 source集合成员,无任何操作,则返回0.
例子:
redis> sadd myset "one"
(integer) 1
redis> sadd myset "two"
(integer) 1
redis> sadd myotherset "three"
(integer) 1
redis> smove myset myotherset "two"
(integer) 1
redis> smembers myset
1) "one"
redis> smembers myotherset
1) "three"
2) "two"
redis>
spop key [count]
从存储在key的集合中移除并返回一个或多个随机元素。
此操作与SRANDMEMBER类似,它从一个集合中返回一个或多个随机元素,但不删除元素。
返回值:bulk-string-reply:被删除的元素,或者当key不存在时返回nil。
例子:
redis> sadd myset "one"
redis> sadd myset "two"
redis> sadd myset "three"
redis> spop myset
redis> smembers myset
redis>sadd myset "four"
redis>sadd myset "five"
redis>spop myset 3
redis>smembers myset
spandmember key [count]
仅提供key参数,那么随机返回key集合中的一个元素.
Redis 2.6开始,可以接受 count 参数,如果count是整数且小于元素的个数,返回含有 count 个不同的元素的数组,如果count是个整数且大于集合中元素的个数时,仅返回整个集合的所有元素,当count是负数,则会返回一个包含count的绝对值的个数元素的数组,如果count的绝对值大于元素的个数,则返回的结果集里会出现一个元素出现多次的情况.
仅提供key参数时,该命令作用类似于spop命令,不同的是spop命令会将被选择的随机元素从集合中移除,而spandmember仅仅是返回该随记元素,而不做任何操作.
返回值:
bulk-string-reply: 不使用count 参数的情况下该命令返回随机的元素,如果key不存在则返回nil。
array-reply: 使用count参数,则返回一个随机的元素数组,如果key不存在则返回一个空的数组。
例子:
redis> sadd myset one two three
(integer) 3
redis> spandmember myset
"one"
redis> spandmember myset 2
1) "three"
2) "one"
redis> spandmember myset -5
1) "one"
2) "one"
3) "one"
4) "one"
5) "one"
redis>
说明:
一、传递count参数时的行为规范
当传递了一个值为正数的count参数,返回的元素就好像从集合中移除了每个选中的元素一样(就像在宾果游戏中提取数字一样)。但是元素不会从集合中移除。所以基本上:
1、不会返回重复的元素。
2、如果count参数的值大于集合内的元素数量,此命令将会仅返回整个集合,没有额外的元素。
相反,当count参数的值为负数时,此命令的行为将发生改变,并且提取操作就像在每次提取后,重新将取出的元素放回包里一样,因此,可能返回重复的元素,以及总是会返回我们请求的数量的元素,因为我们可以一次又一次地重复相同的元素,除了当集合为空(或者不存在key)的时候,将总是会返回一个空数组。
二、返回元素的分布
当集合中的元素数量很少时,返回元素分布远不够完美,这是因为我们使用了一个近似随机元素函数,它并不能保证良好的分布。
所使用的算法(在dict.c中实现)对哈希表桶进行采样以找到非空桶。一旦找到非空桶,由于我们在哈希表的实现中使用了链接法,因此会检查桶中的元素数量,并且选出一个随机元素。
这意味着,如果你在整个哈希表中有两个非空桶,其中一个有三个元素,另一个只有一个元素,那么其桶中单独存在的元素将以更高的概率返回。
srem key member [member …]
在key集合中移除指定的元素. 如果指定的元素不是key集合中的元素则忽略 如果key集合不存在则被视为一个空的集合,该命令返回0.
如果key的类型不是一个集合,则返回错误.
返回值:
integer-reply:从集合中移除元素的个数,不包括不存在的成员.
例子:
redis> sadd myset "one"
(integer) 1
redis> sadd myset "two"
(integer) 1
redis> sadd myset "three"
(integer) 1
redis> srem myset "one"
(integer) 1
redis> srem myset "four"
(integer) 0
redis> smembers myset
1) "three"
2) "two"
redis>
sunion key [key …]
返回给定的多个集合的并集中的所有成员.
不存在的key可以认为是空的集合.
返回值:
array-reply:并集的成员列表
例子:
redis> sadd key1 "a"
(integer) 1
redis> sadd key1 "b"
(integer) 1
redis> sadd key1 "c"
(integer) 1
redis> sadd key2 "c"
(integer) 1
redis> sadd key2 "d"
(integer) 1
redis> sadd key2 "e"
(integer) 1
redis> sunion key1 key2
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
redis>
sunionstore destination key [key …]
该命令作用类似于sunion命令,不同的是它并不返回结果集,而是将结果存储在destination集合中.
如果destination 已经存在,则将其覆盖.
返回值:
integer-reply:结果集中元素的个数.
例子:
redis> sadd key1 "a"
(integer) 1
redis> sadd key1 "b"
(integer) 1
redis> sadd key1 "c"
(integer) 1
redis> sadd key2 "c"
(integer) 1
redis> sadd key2 "d"
(integer) 1
redis> sadd key2 "e"
(integer) 1
redis> sunionstore key key1 key2
(integer) 5
redis> smembers key
1) "c"
2) "e"
3) "b"
4) "a"
5) "d"
redis>