Redis学习笔记(持续更新中)
初识NoSql
-
全称是(Remote Dictionary Server)即远程字典服务
-
NoSql就是非关系型数据库
-
Sql是关系型数据库(结构化 约束性强)
-
定义
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
好处及特征
- 键值型(key-value),支持多种数据类型
- 单线程
- 低延迟速度快
- 支持数据持久化存储
- 支持多种语言开发使用
安装
- 官网redis.io
- 下载centos7版本的文件 运行在linux环境下
1.安装C语言编译环境(redis基于C语言开发)
yum install -y gcc tcl
2.解压下载的redis文件
//这是我的文件目录 解压命令 tar -zxvf 文件名
drwxrwxr-x 7 root root 4096 Oct 4 2021 redis-6.2.6
-rw-r--r-- 1 root root 2476542 Apr 22 09:41 redis-6.2.6.tar.gz
3.编译安装redis文件
make && make install
4.任意目录下查看是否安装成功命令(成功会有端口等信息)
redis-server
5.修改默认打开方式(修改redis-conf文件)
//1.修改登录访问主机
bind 0.0.0.0
//2.设置后台运行
daemonize yes
//设置登录密码
requirepass 密码
初步使用Redis
Redis通用命令
-
keys命令
-
参数有 *
keys * //就表示查询所有键 keys a* //就表示查询所有以a开头的键
-
-
del命令
- del后面接一个键名或者多个键名 表示删除一个或者多个
-
expire
-
表示设置键的存活时间
expire age 20 //表示20秒后删除age键
-
如何查看键的剩余存活时间
ttl age
String类型的常用命令
- set (表示添加或修改一个string类型的键值对)
- get (表示获取一个string类型的值)
- mset (表示添加或修改多个string类型的键值对)
- mget (表示获取多个string类型的值)
- incr (表示整形的自增加一)
- incrby (表示整形的自增加指定步长)
- incrbyfloat (表示浮点型的自增加指定步长)
- setnx (表示存在则不添加键值对)
- setex (表示键值对存活时间)
key的结构
可以写多级结构
set zyl:user:1 表示三层目录结构
Hash类型(参数多一个字段名称)
//例如 hset 键名 字段名 值
- hset (表示添加或修改一个hash类型的键值对)
- hget (表示获取一个hash类型的值)
- hmset (表示添加或修改多个hash类型的键值对)
- hmget (表示获取多个hash类型的值)
- hgetall (表示获取指定键所有的字段名和值)
- hincrby (表示整形的自增加指定步长)
- hsetnx (表示存在则不添加键值对)
- hsetex (表示键值对存活时间)
- hkeys (所有的键的字段)
- hvals (所有键的字段值)
-
List类型
-
lpush (从链表左侧存入)
lpush user 1 2 3 //实际的顺序是3 2 1
-
lpop (从链表左侧取值)
lpop users 1 //拿到的值就是3
-
rpush (从链表右侧存入)
rpush users 1 2 3 //实际的顺序就是1 2 3
-
rpop (从链表右侧取值)
rpop users 1 //拿到的数据是3
-
lrange (从链表一段范围取值)
lrange users 1 2 //拿到的就是1 2
Set类型
特点是
-
无序
-
元素不重复
-
查询快
-
支持交集,并集,差集等功能
-
相关命令
-
sadd (添加一个或者多个元素)
sadd u 1 2 3 //表示添加在u中添加1 2 3
-
srem (删除指定元素)
srem u 1 //表示删除u中的1
-
scard (查询指定key拥有的元素数量)
scard u //现在只有两个元素了 上面删除了一个
-
sismember (查询指定键是否有元素)
sismember u 1 //这就是没有查到
-
smembers (查询该键下所有的值)
smembers u //查到 2 3
-
sdiff (表示差集)
//添加数据 sadd zs a b c (integer) 3 127.0.0.1:6379> sadd ls a d e (integer) 3 127.0.0.1:6379> sdiff ls zs 1) "e" 2) "d"
-
sinter (表示交集)
127.0.0.1:6379> sinter ls zs 1) "a"
-
sunion (表示并集)
127.0.0.1:6379> sunion ls zs 1) "a" 2) "c" 3) "e" 4) "d" 5) "b"
SortedSet类型
-
可排序
-
查询速度快
-
元素不重复
//使用命令查看 help @sorted_set
Redis的java客户端
1.导入依赖
//jedis依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.3.0</version> </dependency> //导入测试依赖 <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.7.0</version> <scope>test</scope> </dependency>
2.测试步骤
package com.zyl; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import redis.clients.jedis.Jedis; public class JedisTest { private Jedis jedis; @BeforeEach public void setUp() { //建立连接 jedis = new Jedis("8.130.94.244", 6379); //设置密码 jedis.auth("123456"); //选择数据库 jedis.select(0); } //测试是否连接成功 @Test void testString() { String result = jedis.set("name", "zyl"); System.out.println(result); System.out.println("--------------"); String name = jedis.get("name"); System.out.println(name); } //关闭连接 @AfterEach public void tearDown() { //异常判断 if (jedis != null) { jedis.close(); } } }
jedis连接线程不安全,建议受用使用连接池
-
我配置了一个连接池工具类
package com.zyl.Utils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class jedisConnectionFactory { private final static JedisPool jedisPool; static { //配置连接池 JedisPoolConfig poolConfig =new JedisPoolConfig(); //最大连接数 poolConfig.setMaxTotal(8); //最大空闲连接 poolConfig.setMaxIdle(8); poolConfig.setMinIdle(0); //最大等待时间 poolConfig.setMaxWaitMillis(1000); //创建连接池对象 jedisPool=new JedisPool(poolConfig,"8.130.94.244",6379,1000,"123456"); } public static Jedis getJedis(){ return jedisPool.getResource(); } }
-
新的获取连接代码
package com.zyl; import com.zyl.Utils.jedisConnectionFactory; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import redis.clients.jedis.Jedis; public class JedisTest { private Jedis jedis; @BeforeEach public void setUp() { //建立连接 // jedis = new Jedis("8.130.94.244", 6379); jedis = jedisConnectionFactory.getJedis(); //设置密码 jedis.auth("123456"); //选择数据库 jedis.select(0); } //测试是否连接成功 @Test void testString() { long result = jedis.setnx("name", "zyl"); System.out.println(result); System.out.println("--------------"); String name = jedis.get("name"); System.out.println(name); } //关闭连接 @AfterEach public void tearDown() { if (jedis != null) { jedis.close(); } } }
-