To answer your question 1:
There are things that you can try, but ultimately you do the equivalent of restarting Redis: flush all of your data, kill all your connections.
To answer your question 2:
I believe this is related to behavior of the underlying memory allocator, jemalloc. You can read a really good overview here:
https://www.facebook.com/notes/facebook-engineering/scalable-memory-allocation-using-jemalloc/480222803919
To make a long story short; when allocating memory, jemalloc requests a large chunk of memory it calls an arena, and services smaller requests from those arenas. An arena can only be freed back to the OS when all of the memory that had been allocated from the arena is freed. You are seeing high memory fragmentation ratios as your data expires because there is still some data allocated from a large number of your arenas that just hasn't been freed, so jemalloc can't release that arena back to the OS. As a few last keys get expired, or as those connections recycle, those arenas are slowly accessed and freed, eventually leading to low RSS (assuming that the later downward movement RSS and fragmentation ratio is related to freeing, and not swapping Redis to disk).
Also, looking at your Redis "used memory" and "used memory RSS" numbers, it looks like Redis was partially swapped out just before Thursday 00:00.
To answer your question 3:
RSS is what Redis discovers by examining the contents of /proc for the Redis process. When I said that Redis looked like it was partially swapped out, it was because you saw a drop in RSS then a rise in RSS, but didn't have a similar rise in Redis used memory. This tells me that Redis was swapped out (reducing RSS) and then gradually swapped back in when it needed to expire or handle requests for certain keys. Eventually it either frees all of the data back to the OS, or is completely swapped out. To tell which, I'd need more information from Redis and from other commands running on your server.
- Josiah