简介

Nosql

非关系型数据库与关系型数据库对比

  • 非结构化
  • 无关联
  • 非SQL
  • 没事务ACID

认识Redis

特征:

  • 键值型
  • 单线程,命令具备原子性
  • 基于内存
  • 支持数据持久化
  • 支持主从集群,分片集群
  • 支持多语言客户端

使用命令行

win,linux得安装包下载 端口号:6379

进入 /usr/local/etc/,然后打开redis.config,修改配置 daemonize no 将 no 改为 yes 。设置密码:requirepass foobared 将 foobared 改为 1234 。(这一个过程需要用 vim 打开,具体配置由于 Redis 版本不一致,所在的行数也不一样,自己找一下吧。)

接下来,以守护线程的方式启动redis在终端输入:

redis-server /opt/homebrew/etc/redis.conf

然后用命令查看redis是否开启:

ps aux | grep redis

默认创建16个库

数据类型

常用命令

字符串操作命令(string)

key的结构

哈希操作命令(hash)

列表操作命令(list)

类似于java中的LinkedList,可以看作双向链表

  • 有序
  • 元素可重复
  • 插入删除快
  • 查询速度一般

集合操作命令(set)

与java中的hashset类似

(不重复,无序) 查找快,支持交并差集

有序集合操作命令(sortedSet)

与java中的TreeSet类似,但底层有差别,SortedSet中每个元素值都带有一个score属性,用于对元素排序(一个跳表SkipList加hash表)

  • 可排序
  • 元素不重复
  • 查询速度快
  • 常用作排行榜

通用命令

命令合集


keys //查看所有匹配的key,生产环境下不建议使用,会阻塞

del //删除一个key

exists //判断key是否存在

expire //给key设置有效期,到期key自动删除

ttl //查看有效期



//String类型
最大空间不超过512m

set //key,val
get //取
mset //批量添加
mget //批量取

incr //自增
incrby //设置步长(-1即为自减)
decr //自减
incrbyfloat //按浮点数设置步长

setnx //添加一个键值对,不存在key才会执行(纯粹的添加)
setex //添加key并设置有效期


//Hash类型

hset //(key filed value) 添加或修改hash类型key的filed值
hget //(key filed) 获取对应的value值
hmset //批量,同sting类型
hmget
hgetall //得到所有field和value

hkeys //只得到field
hvals //只得到value

hincrby

hsetnx


//List类型

lpush //向链表左侧插入一个或多个元素
lpop //从左侧取第一个元素,没有则返回nil

rpush
rpop

lrange key start end //返回一段角标范围内的所有元素

blpop brpop //会等待一段时间,不会直接返回nil



//Set类型

sadd //(key,member...)添加一个或多个
srem //(key,member...)移除指定元素

scard //返回set中元素的个数

sismember //(key member)判断一个元素是否存在set中
smembers //获取全部元素

sinter //(key1,key2)求交集
sdiff //差集
sunion //并集


//SortedSet类型

zadd //(key score member)添加一个或多个元素到set中,若已存在则更新
zrem //(key,member) 删除指定元素

zscore //(key,member)获取指定元素的score值
zrank //(key,member)获取指定元素的排名
zcard //(key) 获取元素个数

zcount //(key,min,max)统计score指定范围内的元素个数

zincrby //(key,incriment,member)指定元素按步长自增

zrange //(key,min,max)按score排序后,返回指定排名范围内的元素
zrangebyscore //(key,min,max)score范围内的元素

zdiff
zinter
zunion

//所有排名默认生序,降序在命令z后加rev

Redis的Java客户端

Jedis

Redis在Java中的操作

Spring Data Redis

导入设置

在创建redisTemplate对象时,序列化器可使key不至于乱码

@Slf4j  
@Configuration  
  
public class RedisConfiguration {  
  
    @Bean  
    public RedisTemplate redisTemplate (RedisConnectionFactory redisConnectionFactory){  
        log.info("开始创建redis模版对象......");  
        RedisTemplate redisTemplate = new RedisTemplate();  
        //设置redis连接工厂对象  
        redisTemplate.setConnectionFactory(redisConnectionFactory);  
        //设置redis key 的序列化器  
        redisTemplate.setKeySerializer(new StringRedisSerializer());  
        return redisTemplate;  
  
    }  
  
}

关于redis在java内的测试

@SpringBootTest  
public class SpringDataRedisTest {  
    @Autowired  
    private RedisTemplate redisTemplate;  
  
    @Test  
    public void testRedisTemplate(){  
        System.out.println(redisTemplate);  
        HashOperations hashOperations = redisTemplate.opsForHash();  
        ListOperations listOperations = redisTemplate.opsForList();  
        ValueOperations valueOperations = redisTemplate.opsForValue();  
        SetOperations setOperations = redisTemplate.opsForSet();  
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();  
    }  
  
    @Test  
    public void testString(){  
        //set  
        redisTemplate.opsForValue().set("city","北京");  
        //get  
        String city = (String) redisTemplate.opsForValue().get("city");  
        System.out.println(city);  
        //setex  
        redisTemplate.opsForValue().set("code","1234",3, TimeUnit.MINUTES);  
        //setnx  
        redisTemplate.opsForValue().setIfAbsent("lock","1");  
        redisTemplate.opsForValue().setIfAbsent("lock","2");  
    }  
}

快速入门

序列化

RedisTemplate会自动把目标(key)序列化,这会使之变成“乱码”

自定义序列化

StringRedisTemplate

项目实战

技术点

黑马点评