目录
常用的简单操作命令
Redis字符串中的SDS
Redis事务
Key的过期时间
Redis实现缓存简单示例

常用的简单操作命令
Redis提供了多种数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。以下是每种数据类型的常用基本操作命令示例:
1. 字符串(String):
-  
SET key value:设置键值对。 -  
GET key:获取键的值。 -  
INCR key:递增键的值。 -  
DECR key:递减键的值。 
2. 哈希(Hash):
-  
HSET key field value:设置哈希字段的值。 -  
HGET key field:获取哈希字段的值。 -  
HDEL key field [field...]:删除一个或多个哈希字段。 -  
HGETALL key:获取哈希中的所有字段和值。 
3. 列表(List):
-  
LPUSH key value [value...]:从左侧插入一个或多个元素。 -  
RPUSH key value [value...]:从右侧插入一个或多个元素。 -  
LPOP key:从左侧弹出一个元素。 -  
RPOP key:从右侧弹出一个元素。 -  
LRANGE key start stop:获取列表中指定范围的元素。 
4. 集合(Set):
-  
SADD key member [member...]:向集合中添加一个或多个成员。 -  
SREM key member [member...]:从集合中移除一个或多个成员。 -  
SMEMBERS key:获取集合中的所有成员。 -  
SISMEMBER key member:检查成员是否存在于集合中。 
5. 有序集合(Sorted Set):
-  
ZADD key score member [score member...]:向有序集合中添加一个或多个成员,带有分数。 -  
ZREM key member [member...]:从有序集合中移除一个或多个成员。 -  
ZRANGE key start stop [WITHSCORES]:按分数范围获取成员。 -  
ZSCORE key member:获取成员的分数。 
这些命令只是每种数据类型的基本操作的示例,Redis提供了丰富的命令集,允许更多复杂的操作和应用程序构建。根据您的具体需求,可以使用适当的命令来操作和管理Redis中的数据。
Redis字符串中的SDS
Redis使用SDS(Simple Dynamic String)实现字符串对象的存储是出于性能和灵活性方面的考虑。以下是一些原因:
-  
动态长度:
SDS允许字符串对象的长度动态变化,而不需要预先分配固定的内存空间。这使得在插入、追加、截断字符串时,Redis可以更有效地管理内存。 -  
二进制安全:
SDS对待字符串为二进制数据,它不仅可以存储文本字符串,还可以存储任何二进制数据,如图像、音频等。这使得 Redis 更灵活,不仅仅用于字符串,还可以处理其他数据类型。 -  
高效的字符串操作:
SDS提供了一系列高效的字符串操作,如追加、删除、截断等,这些操作在不需要重新分配内存的情况下执行。这减少了内存分配和复制的开销,提高了性能。 -  
减少内存分配开销:
SDS内部维护了字符串的长度和可用空间,这减少了重新分配内存的频率。这对于避免内存碎片和减少内存分配的开销非常有利。 -  
C语言兼容性:
SDS结构与C语言字符串的结构非常相似,这使得 Redis 可以更容易与C语言库和函数进行集成。 
总之,SDS 提供了一种高性能、灵活和高效的方式来处理字符串数据,使 Redis 更适合处理各种不同类型的数据,而不仅仅是文本字符串。这对于Redis作为高性能缓存和数据存储系统非常有用。
Redis事务
Redis中的事务是通过 MULTI、EXEC、DISCARD 和 WATCH 命令来执行的。以下是这些命令的基本操作示例:
-  
MULTI:开始一个事务。这个命令表示开始一个事务块,之后执行的命令将被添加到事务队列,而不会立即执行
 -  
执行事务块(EXEC):执行事务队列中的所有命令。
这个命令表示执行之前添加到事务队列中的所有命令。如果事务执行成功,将返回一个包含所有命令执行结果的数组。如果事务中的任何命令执行失败,将返回一个空数组。
MULTI # 开启事务 ... # 操作指令 EXEC # 执行事务
 -  
放弃事务(DISCARD):取消当前事务。
DISCARD
这个命令表示取消当前事务,清空事务队列中的所有命令,不执行事务中的任何命令。
 -  
监视键(WATCH):监视一个或多个键,以在事务执行期间检测键是否被修改。
WATCH key [key...]
这个命令表示监视指定的一个或多个键。如果在执行 EXEC 命令之前,任何被监视的键被其他客户端修改,事务将失败。
 
下面是一个简单的事务操作示例:
MULTI SET key1 "value1" GET key2 INCR key3 EXEC
在这个示例中,我们首先使用 MULTI 命令开启事务,然后将多个命令添加到事务队列中(SET、GET、INCR),最后使用 EXEC 命令来执行事务。如果所有命令成功执行,EXEC 将返回每个命令的结果;如果其中任何一个命令失败,事务将被取消,EXEC 将返回一个空数组。
Redis事务允许将多个命令打包成一个原子操作,这对于需要保持数据一致性的应用程序非常有用。请注意,Redis的事务不支持回滚,如果事务失败,您需要自己处理数据回滚的逻辑。此外,WATCH 命令用于乐观锁的实现,以确保在事务执行期间,监视的键没有被其他客户端修改。
Key的过期时间
过期时间的机制主要是针对具有时效性的key,是一个非常有用的功能,它允许你在一段时间后自动删除键,从而有效地管理内存和数据的生命周期。
对于实现缓存、会话管理和数据自动清理等场景非常有用。使用它可以避免不再需要的数据长时间占用内存,从而提高Redis数据库的性能和可用性。
关于过期时间的常用技巧:
-  
设置过期时间:你可以使用
EXPIRE或PEXPIRE命令来为一个键设置过期时间。EXPIRE使用以秒为单位的过期时间,而PEXPIRE使用以毫秒为单位的过期时间。例如:shellCopy codeEXPIRE key 3600 # 设置键 key 在 3600 秒后过期 PEXPIRE key 60000 # 设置键 key 在 60000 毫秒后过期
 -  
查看剩余过期时间:你可以使用
TTL或PTTL命令来查看键的剩余过期时间,以秒或毫秒为单位。如果键已过期或不存在,这些命令将返回-1。例如:shellCopy codeTTL key # 返回键 key 的剩余过期时间(秒) PTTL key # 返回键 key 的剩余过期时间(毫秒)
 -  
移除过期时间:你可以使用
PERSIST命令来移除键的过期时间,从而使键永不过期。例如:shellCopy code PERSIST key # 移除键 key 的过期时间
 -  
判断键是否已过期:你可以使用
KEYS或SCAN命令来查找已过期的键,然后将其删除。请谨慎使用KEYS,因为它可能会导致性能问题,特别是在大型数据库中。 -  
自动删除:Redis会自动处理过期键的删除。当你尝试访问一个已经过期的键时,Redis将返回一个空值。过期键的自动删除是异步的,因此实际删除时间可能略有延迟。
 -  
过期策略:Redis使用定期删除和惰性删除两种策略来管理过期键。定期删除会周期性地检查并删除过期键,而惰性删除是在键被访问时检查并删除过期键。
 
Redis实现缓存简单示例
在Java中使用Redis实现缓存是一种常见的做法,可以提高应用程序的性能。以下是一个简单的示例,演示如何使用Java和Redis来实现缓存。需要在Java项目中引入Redis客户端库,如Jedis或Lettuce,以便连接和与Redis服务器进行交互。
-  
连接到Redis服务器,然后使用
setex方法将用户数据存储到Redis中,并为键设置过期时间。 -  
尝试从缓存中获取数据,如果数据存在,就使用缓存数据;如果缓存中没有数据,它会从数据源获取数据,然后将数据存入缓存。
 
import redis.clients.jedis.Jedis;
public class RedisCacheExample {
    public static void main(String[] args) {
        // 创建一个Jedis客户端实例,连接到Redis服务器
        Jedis jedis = new Jedis("localhost", 6379);
        // 设置缓存数据
        String key = "user:123"; // 假设存储用户数据的缓存键
        String userData = "{'id': 123, 'name': 'John'}"; // 用户数据的 JSON 字符串
        int cacheTimeout = 60; // 缓存超时时间(以秒为单位)
        // 将用户数据存储到Redis中,设置过期时间
        jedis.setex(key, cacheTimeout, userData);
        // 从缓存中获取数据
        String cachedData = jedis.get(key);
        if (cachedData != null) {
            System.out.println("Data from cache: " + cachedData);
        } else {
            // 如果缓存中没有数据,从数据源获取数据并存入缓存
            String dataFromDataSource = fetchDataFromDataSource();
            jedis.setex(key, cacheTimeout, dataFromDataSource);
            System.out.println("Data from data source: " + dataFromDataSource);
        }
        // 关闭Jedis客户端连接
        jedis.close();
    }
    // 模拟从数据源获取数据的方法
    private static String fetchDataFromDataSource() {
        // 这里可以模拟从数据库或其他数据源中获取数据
        return "{'id': 123, 'name': 'John'}";
    }
}
                


















